KingbaseES中truncate和oracle中truncate区别
truncate命令在KingbaseES中本质上区别于oracle。因为oracle中,数据文件datafile可以被表所共享,每张表被分配各自的连续的extents。而在KingbaseES中,数据文件是独立的,不同表不存在共享数据文件的说法。
下面我们看一下KingbaseES数据库在内部怎么实现的truncate命令。
create table t4 as select * from t3;
insert into t4 select * from t4;
insert into t4 select * from t4;
insert into t4 select * from t4;
insert into t4 select * from t4;
insert into t4 select * from t4;
select count(*) from t4;
vacuum t4;
select relfilenode from sys_class where relname='t4';
select pg_relation_filepath('t4');
[kingbase@localhost 16052]$ ll 252980*
-rw------- 1 kingbase kingbase 8192 Oct 19 10:47 252980
-rw------- 1 kingbase kingbase 24576 Oct 19 10:47 252980_fsm
-rw------- 1 kingbase kingbase 8192 Oct 19 10:47 252980_vm
下面开启事务执行
begin;
truncate table t4;
select count(*) from t4;
select relfilenode from sys_class where relname='t4';
这时候 relfilenode变成了252983,大小是0的对象,而原来的relfilenode 250980 还在,大小不变。
[kingbase@localhost 16052]$ ll 252980*
-rw------- 1 kingbase kingbase 8192 Oct 19 10:47 252980
-rw------- 1 kingbase kingbase 24576 Oct 19 10:47 252980_fsm
-rw------- 1 kingbase kingbase 8192 Oct 19 10:47 252980_vm
You have mail in /var/spool/mail/kingbase
[kingbase@localhost 16052]$ ll 252983*
-rw------- 1 kingbase kingbase 0 Oct 19 10:48 252983
看看回滚会发生什么
test=# rollback;
ROLLBACK
test=# select count(*) from t4;
count
\-------
160
(1 row)
test=# select relfilenode from sys_class where relname='t4';
relfilenode
\-------------
252980
(1 row)
[kingbase@localhost 16052]$ ll 252980* 252983*
ls: cannot access 252983*: No such file or directory
-rw------- 1 kingbase kingbase 8192 Oct 19 10:49 252980
-rw------- 1 kingbase kingbase 24576 Oct 19 10:49 252980_fsm
-rw------- 1 kingbase kingbase 8192 Oct 19 10:49 252980_vm
可以看到
1,数据恢复成原来的,并且relfilenode变成了原来的252980.KingbaseES数据库的truncate可以回滚。而oracle中的truncate不能回滚。
2,因为回滚继续使用对象252980,那么252983就被删除了,因为事务已经结束了,252983也就用不到了。
下面不开启事务,truncate不运行在事务块里测试一下
truncate table t4;
select relfilenode from sys_class where relname='t4';
relfilenode
\-------------
252984
[kingbase@localhost 16052]$ ll 252980* 252983* 252984*
ls: cannot access 252983*: No such file or directory
-rw------- 1 kingbase kingbase 0 Oct 19 10:58 252980
-rw------- 1 kingbase kingbase 0 Oct 19 10:58 252984
[kingbase@localhost 16052]$ ll 252980* 252984*
ls: cannot access 252980*: No such file or directory
-rw------- 1 kingbase kingbase 0 Oct 19 10:58 252984
1,我先后查看两次relfilenode,可以看到最开始能查到truncate前的252980,但是无论怎样它的大小已经变成0,这时候可以判断已经没办法回滚了,当再次查询发现252980被删除了,只剩下252984
因为没法利用252980回滚了,所以可以被数据库删除掉了。最后只能查到最新的对象号252984
2,经过多次测试发现有时候老的对象号252980并不是立即被删除,我想应该和数据库有自己的删除机制有关。总之,这个老的对象号已经没有用了。
总结:
当truncate命令在事务块里可回滚。而truncate可回滚无疑对业务有一些帮助。根据KingbaseES和oracle对于truncate的内存原理不同,我们可以理解KingbaseES中truncate的代价很小,因为KingbaseES中的truncate不会存在存储空间重用的问题,也没有触发对象级检查点的操作,当进行truncate时候不会对业务产生太大影响,在业务运行期间我们可以使用truncate及时恢复一些存储空间。
需要注意的是如果truncate命令和另外的session对于正在truncate的表有操作(包括Select),那么很可能会有锁冲突,虽然这种可能性很小,但还是要注意。
KingbaseES中truncate和oracle中truncate区别的更多相关文章
- 论MySQL中如何代替Oracle中select into new_table from old_table
v_receipt warehouse_receipt%ROWTYPE;-- 这里创建表类型,v_receipt复刻了warehouse_receipt的类型(相当于拥有了所有相同的字 ...
- SQL中Charindex和Oracle中对应的函数Instr
转:http://blog.csdn.net/zhuyu19911016520/article/details/8568640 sql :charindex('字符串',字段)>0 charin ...
- Java SpringMvc+hibernate架构中,调用Oracle中的sp,传递数组参数
一.问题 我们调用数据,大都是可以直接获取表中的数据,或者用复杂点的sql语句组成的.但是,有时候,当这样达不到我们要的全部数据的时候,这时,我们就用到了存储过程[sp],如果sp需要参数是数组的话, ...
- oracle 中的存储过程
oracle 中的存储过程 --oracle 中的存储过程, --不带任何参数的 CREATE OR REPLACE PROCEDURE PRO_TEST AS -- AS 和is 没有任何区别 ...
- Oracle中的数据类型和数据类型之间的转换
Oracle中的数据类型 /* ORACLE 中的数据类型: char 长度固定 范围:1-2000 VARCHAR2 长度可变 范围:1-4000 LONG 长度可变 最大的范围2gb 长字符类型 ...
- Oracle中的内置函数在sql中的转换整理
程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...
- Oracle中REGEXP_SUBSTR函数(转)
Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','2 ...
- Oracle中使用透明网关链接到Sqlserver[Z]
Oracle中使用透明网关链接到Sqlserver 在最近项目中需要从Oracle中访问SQL Server数据库, 自然想到了透明网关. 因为Oracle数据库是Linux上的, 而Linux上的O ...
- shell编程中如何执行oracle语句
shell编程中如果向oracle中插入数据之类的,需要先把执行语句放到文件中,然后再@这个文件执行 有如下俩种方式供参考: SQL=`sqlplus user/pwd@orains << ...
- 【Oracle】浅析Oracle中的事务
1. 什么是事务 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不 ...
随机推荐
- MySQL5.7的账号回收权限
因MySQL无排除表权限功能,测试隔离表回收权限以下方案: 1,代理账号(角色)方案 方案:创建一个代理账号(角色),对库的800多张表逐个赋权,58张隔离表赋只读,其他30多个账号绑定到这个代理账号 ...
- Springboot+Vue+ElementUI实现的宿舍管理系统
项目说明 doman是一个基于Springboot+Vue实现的前后端分离的宿舍管理系统.项目为本人亲手打造,需要的朋友可以拿去做个修改也是不错的.大神请忽略:) 项目功能 详细请看功能演示: Spr ...
- centos7创建MySQL自动备份脚本
说明 最近需要给wordpress站点搞一个定时备份mysql数据库,所以记录一下. 操作步骤 1.创建备份脚本 这一步最重要,创建目录:/home/wpblog_backup,然后在目录下创建she ...
- WinRT: 可能是 Windows 上最好用的 Native ABI 和远程调用方案
前言 Windows 自从很久以来就有一个叫做 COM 的 Native ABI.这是一套面向对象的 ABI,在此之上 Windows 基于 COM ABI 暴露了各种各样的 API,例如 Manag ...
- win32 - Screen to bmp file(BYTE)
void WINAPI CaptureScreenIntoFile() { BITMAPFILEHEADER bfHeader; BITMAPINFOHEADER biHeader; HGDIOBJ ...
- 数据分析day02
案例 需求:双均线策略制定 1.使用tushare包获取某股票的历史行情数据 2.计算该股票历史数据的5日均线和30日均线 - 什么是均线? - 对于每一个交易日,都可以计算出前N天的移动平均值,然后 ...
- 第125篇: 期约Promise基本特性
好家伙,本篇为<JS高级程序设计>第十章"期约与异步函数"学习笔记 1.非重入期约 1.1.可重入代码(百度百科) 先来了解一个概念 可重入代码(Reentry cod ...
- 【Azure 事件中心】Azure Event Hub中的数据能不能存储大于7天呢?如果7天之后是不是会自动删除呢?
问题描述 Event Hub中有个retention的设置为7天,有没有办法增大这个Retention的时间? 如果没办法,是不是超过7天的数据就会被删除? 问题解答 因为Azure Event Hu ...
- 【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
问题描述 部署在App Service For Windows 中的网站使用 Java Spring Boot + 静态文件 (浏览器端使用Vue.js 与服务器端Java Spring Boot交互 ...
- Java 异常处理(2) : 异常处理的方式二:throws + 异常类型
1 package com.bytezero.throwable; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 impor ...