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区别的更多相关文章

  1. 论MySQL中如何代替Oracle中select into new_table from old_table

    v_receipt         warehouse_receipt%ROWTYPE;-- 这里创建表类型,v_receipt复刻了warehouse_receipt的类型(相当于拥有了所有相同的字 ...

  2. SQL中Charindex和Oracle中对应的函数Instr

    转:http://blog.csdn.net/zhuyu19911016520/article/details/8568640 sql :charindex('字符串',字段)>0 charin ...

  3. Java SpringMvc+hibernate架构中,调用Oracle中的sp,传递数组参数

    一.问题 我们调用数据,大都是可以直接获取表中的数据,或者用复杂点的sql语句组成的.但是,有时候,当这样达不到我们要的全部数据的时候,这时,我们就用到了存储过程[sp],如果sp需要参数是数组的话, ...

  4. oracle 中的存储过程

      oracle 中的存储过程 --oracle 中的存储过程, --不带任何参数的 CREATE OR REPLACE PROCEDURE PRO_TEST AS -- AS 和is 没有任何区别 ...

  5. Oracle中的数据类型和数据类型之间的转换

    Oracle中的数据类型 /* ORACLE 中的数据类型: char 长度固定 范围:1-2000 VARCHAR2 长度可变 范围:1-4000 LONG 长度可变 最大的范围2gb 长字符类型 ...

  6. Oracle中的内置函数在sql中的转换整理

    程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...

  7. Oracle中REGEXP_SUBSTR函数(转)

    Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','2 ...

  8. Oracle中使用透明网关链接到Sqlserver[Z]

    Oracle中使用透明网关链接到Sqlserver 在最近项目中需要从Oracle中访问SQL Server数据库, 自然想到了透明网关. 因为Oracle数据库是Linux上的, 而Linux上的O ...

  9. shell编程中如何执行oracle语句

    shell编程中如果向oracle中插入数据之类的,需要先把执行语句放到文件中,然后再@这个文件执行 有如下俩种方式供参考: SQL=`sqlplus user/pwd@orains << ...

  10. 【Oracle】浅析Oracle中的事务

    1. 什么是事务 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不 ...

随机推荐

  1. 用ELK分析每天4亿多条腾讯云MySQL审计日志(2)--EQL

    上一篇介绍了用ELK分析4亿多条审计日志过程,现在介绍如何用Python3分析ES的程序 需要分析的核心库审计数据: 1,950多张表,几十个账号, 2,5种操作类型(select,update,in ...

  2. Java I/O 教程(五) BufferedOutputStream 类

    Java BufferedOutputStream Class Java BufferedOutputStream class 用于缓冲一个输出流 其内部使用缓冲区存储数据,可以更有效率的往流中写入数 ...

  3. 从零开始写 Docker(一)---实现 mydocker run 命令

    本文为从零开始写 Docker 系列第一篇,主要实现 mydocker run 命令,构造了一个具有基本的 Namespace 隔离的简单容器. 如果你对云原生技术充满好奇,想要深入了解更多相关的文章 ...

  4. IDA 反汇编 explorer

    之前写过一篇关于 IDA 在无 dmp 文件下如何定位到崩溃点的文章,由于其中涉及到公司项目,就仅限自己看了 正好今天看到一篇关于火绒软件误杀 explorer 的文章,并且有相关的复现过程 文章已经 ...

  5. go最新版本1.15安装配置及编辑器2020.2版本goland

    下载 https://golang.google.cn/dl/ 配置 go env #查看是否安装成功 # 终端输入修改镜像地址 $ go env -w GO111MODULE=on $ go env ...

  6. vue运行时报错Error from chokidar

    原文博客地址 Error from chokidar (/home/youyou/文档/vue/vuetask01/node_modules/lodash): Error: ENOSPC: Syste ...

  7. django之manage.py migrate无效的问题

    问题 已有的model,迁移之后,想重新设置字段,于是将migrations文件夹中除__init__.py之外其他文件都删掉,并且把数据库中的表删除,再次执行以下步骤python manage.py ...

  8. Ubuntu虚拟机开机显示initramfs

    因为我的虚拟机路径放在了移动硬盘当中,所以连接有点失常就断开了,紧接着虚拟机也异常关闭了. 重启后进入了initramfs界面 查看出错的分区,如下图所示,是/dev/sda5分区有损坏 解决方法: ...

  9. 第120篇: DOM编程(常用操作、动态脚本、样式及动态表格)

    好家伙,我回来了, 本篇为<JS高级程序设计>第十四章"DOM编程"学习笔记   1.DOM编程 我们知道DOM是HTML文档的编程接口, 我们可以通过HTML代码实现 ...

  10. git修改地址三种方法

    1.修改命令 git remote set-url origin [NEW_URL] 2.先删后加 git remote rm origin git remote add origin [url]3. ...