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. centos7源码方式安装zabbix-4.0

    1.关闭防火墙 systemctl stop firewalld.service #临时关闭firewall systemctl disable firewalld.service #禁止firewa ...

  2. win32- copyfile的使用

    #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <tchar.h&g ...

  3. startswith/endswith传元组用法

    className = ["jd_num01","jd_num02","tx_num01", "tx_num02", & ...

  4. 1-Django框架简介以及基本操作

    安装 注意:安装的磁盘目录,以及后续通过Django创建目录的时候,不要出现中文,否则会出现预料之外的错误 建议:禁止套娃,即不要在A项目中创建B项目 # 如果不指定版本号,默认最新版 pip ins ...

  5. 名校AI课推荐 | MIT6.S191《深度学习导论》

    "连续开设5年,对新手友好.易于上手,参加课程的多数学生来自非计算机科学领域--" 推荐一门AI课程--MIT官方深度学习入门课程6.S191<深度学习导论(2022)> ...

  6. 01、etcd基础介绍

    互联网技术发展真的快,层出不穷的新技术.最近项目使用到了etcd,自己之前在部署k8s集群的时候玩过,但是并没有系统的学习.正好趁这个机会,系统性的学习下.文章中的内容有些是来自官方文档,有些是来自网 ...

  7. 【Application Insights】使用Powershell命令向Application Insgihts发送测试数据

    问题描述 在昨天的文章中,介绍了 "[Application Insights]使用CURL命令向Application Insgihts发送测试数据",今天则继续实验通过Powe ...

  8. Java final 关键字使用

    1 package com.bytezreo.finaltest; 2 3 /** 4 * 5 * @Description final 关键字使用 6 * @author Bytezero·zhen ...

  9. mysql for update是锁表还是锁行

    转载至我的博客 https://www.infrastack.cn ,公众号:架构成长指南 在并发一致性控制场景中,我们常常用for update悲观锁来进行一致性的保证,但是如果不了解它的机制,就进 ...

  10. 孔夫子旧书网书籍信息得爬取并保存为json,csv,excel多种文件格式

    python版本:3.7 需要得引入得包: from selenium import webdriver from selenium.common.exceptions import TimeoutE ...