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语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不 ...
随机推荐
- 【Android】使用ContentProvider实现跨进程通讯
1 前言 ContentProvider 即内容提供器,是 Android 四大组件之一,为 App 存取数据提供统一的对外接口,让不同的应用之间可以共享数据. 如图,Server 端通过 C ...
- django中使用celery异步发送邮件
申请163网易发送邮件权限 在django中settings配置文件 #配置邮件服务器 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBac ...
- linux服务器界面初始--day01
linux服务器界面初始 ip add show 查看服务器网卡信息还可以使用ifconfig 局域网ip: 192.168.1.0 10.0.0.0 172.16.1.0 如果网卡没有启用,我们需要 ...
- 【LeetCode哈希表】前k个高频词,利用哈希表+vector进行排序操作
前k个高频词 https://leetcode.cn/problems/top-k-frequent-words/ 给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词. ...
- 【LeetCode数组#1二分法】二分查找、搜索插入、在排序数组中查找元素的第一个和最后一个位置
二分查找 题目 力扣704题目链接 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 ...
- 用Docker搭建DNS服务器
0.准备工作 如果是全新安装的服务器,先要给root账户设置密码,命令是 sudo passwd root 然后切换到root账户 su root 上述过程屏幕输出如下 1.Docker-Compos ...
- hibernate-delete(Entity)的顺序问题
hibernate为我们提供了删除直接根据实体参数删除数据的方法: HibernateTemplate().delete(entity); public void delete(final Objec ...
- 专访实在智能孙林君:颠覆传统RPA的实在IPA模式如何做到真正人人可用?
王吉伟对话实在智能孙林君:颠覆传统引领RPA行业的实在IPA模式是如何炼成的? 王吉伟对话实在智能孙林君:为什么第一款颠覆行业的RPA诞生在实在智能? 专访实在智能孙林君:打造出真正人人可用的实在 ...
- vue3自定义Hooks
比较简单的小demo,直接上代码吧 ts使用defineComponent,setup()里面使用 Composition API 写法,逻辑块清晰,不用前后文查找,拒绝 spaghetti code ...
- SHA算法:数据完整性的守护者
一.SHA算法的起源与演进 SHA(Secure Hash Algorithm)算法是一种哈希算法,最初由美国国家安全局(NSA)设计并由国家标准技术研究所(NIST)发布.SHA算法的目的是生成数据 ...