KingbaseES Truncate 与 Delete 机制比较
使用过Oracle的都知道,Truncate操作由于不需要写redo日志,因此,在性能上会比delete操作更高效,但在实际使用过程中,有时会发现delete比truncate速度更快。以下介绍下二者的机制,让大家对二者有清晰的了解。
一、大数据量删除操作
1、数据准备
创建两张没有索引的大表:t1 , t2 ,每张表的数据量接近 350W
test=# create table t2 as select * from t1;
SELECT 3461120
2、测试Delete操作
test=# checkpoint;
CHECKPOINT test=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/92DB1FC8
(1 row) test=# select relname,relfilenode from sys_class where relname='t1';
relname | relfilenode
---------+-------------
t1 | 16575
(1 row) test=# delete from t1;
DELETE 3461120
Time: 4771.554 ms (00:04.772) test=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/C87A2EC0
(1 row) test=# select pg_wal_lsn_diff('0/C87A2EC0','0/92DB1FC8');
pg_wal_lsn_diff
-----------------
899616504
(1 row)
test=# checkpoint;
CHECKPOINT
test=# select relname,relfilenode from sys_class where relname='t1';
relname | relfilenode
---------+-------------
t1 | 16575
(1 row)
结论:Delete 操作产生了近900M的日志;数据文件的relfilenode 不变。
3、测试Truncate操作
test=# checkpoint;
CHECKPOINT test=# select relname,relfilenode from sys_class where relname='t2';
relname | relfilenode
---------+-------------
t2 | 16581
(1 row) test=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/CAA7C678
(1 row) test=# truncate table t2;
TRUNCATE TABLE
Time: 84.124 ms test=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/CAA82D40
(1 row) Time: 0.327 ms
test=# select relname,relfilenode from sys_class where relname='t2';
relname | relfilenode
---------+-------------
t2 | 16587
(1 row) Time: 0.491 ms
test=# select pg_wal_lsn_diff('0/CAA82D40','0/CAA7C678');
pg_wal_lsn_diff
-----------------
26312
(1 row) Time: 1.239 ms
结论:Truncate 操作基本不产生redo;relfilenode 会变化,这是由于truncate操作相当于新建了个文件。
三、小数据量删除操作比较
1、比较一:数据未写回磁盘前,进行truncate
test=# declare
test-# v_sql text;
test-# begin
test-# for i in 1..1000 loop
test-# drop table if exists t1;
test-# create table t1 as select * from pg_class;
test-# delete from t1;
test-# end loop;
test-# end;
test-# /
ANONYMOUS BLOCK
Time: 7173.891 ms (00:07.174) test=# declare
test-# v_sql text;
test-# begin
test-# for i in 1..1000 loop
test-# drop table if exists t1;
test-# create table t1 as select * from pg_class;
test-# truncate t1;
test-# end loop;
test-# end;
test-# /
ANONYMOUS BLOCK
Time: 7477.366 ms (00:07.477)
结论:truncate 似乎更慢。从操作系统IO看,二者的IO 相差不大。
可能原因:truncate 在操作系统层面的操作实际删除旧文件,新建新文件。当调用操作系统命令删除旧文件时,需要将数据先写回文件,才能删除。而本例中,实际从create table 到truncate 时间很短,数据还未写回文件。
2、测试二:先建表,在删除数据
declare
v_sql text;
begin
for i in 1..1000 loop
v_sql = 'drop table if exists t'||i;
execute immediate v_sql;
v_sql = 'create table t'||i||' as select * from pg_class';
execute immediate v_sql;
end loop;
end; checkpoint; declare
v_sql text;
begin
for i in 1..1000 loop
v_sql = 'delete from t'||i;
execute immediate v_sql;
end loop;
end;
/
ANONYMOUS BLOCK
Time: 3412.780 ms (00:03.413) declare
v_sql text;
begin
for i in 1..1000 loop
v_sql = 'truncate t'||i;
execute immediate v_sql;
end loop;
end;
/
ANONYMOUS BLOCK
Time: 1268.753 ms (00:01.269)
结论:先建表,再checkpoint ,将数据写回数据文件。然后,再比较Delete 和 Truncate 操作,可以看到即使小表,truncate 操作也快很多。
KingbaseES Truncate 与 Delete 机制比较的更多相关文章
- sql中 truncate 、delete与drop区别
相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句(数据定义语言),执行后会自动提交. 不同点: 1. t ...
- truncate 、delete与drop区别
原博文地址:http://www.cnblogs.com/8765h/archive/2011/11/25/2374167.html 相同点: 1.truncate和不带where子句的delete. ...
- sql语句中----删除表数据drop、truncate和delete的用法
sql语句中----删除表数据drop.truncate和delete的用法 --drop drop table tb --tb表示数据表的名字,下同 删除内容和定义,释放空间.简单来说就是把整 ...
- [转]mysql drop、truncate和delete比较
一.drop table tb drop将表格直接删除,没有办法找回. 立刻释放磁盘空间 ,不管是 Innodb和MyISAM . 二.truncate (table) tb 该命令可以清空一个表里的 ...
- truncate与delete的区别
TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源 ...
- sql之truncate 、delete与drop区别
sql之truncate .delete与drop区别相同点:truncate 和不带 where 子句的 delete,以及 drop 一定会删除表内的数据不同点:1. truncate 和 del ...
- 删除表数据drop、truncate和delete的用法
说到删除表数据的关键字,大家记得最多的可能就是delete了 然而我们做数据库开发,读取数据库数据.对另外的两兄弟用得就比较少了 现在来介绍另外两个兄弟,都是删除表数据的,其实也是很容易理解的 老大- ...
- sql server 中删除表中数据truncate和delete的区别(转载自.net学习网)
我们都知道truncate table可以用来删除整个表的内容,它与delete后面不跟where条件的效果是一样.但除此之外,我们还清楚它们之间有其它的区别吗?本章我们将一起讨论truncate与d ...
- TRUNCATE,DORP,DELETE
TRUNCATE,DORP,DELETE 相同点: truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: 1. truncate和 delete只删除数据不删 ...
随机推荐
- Linux shell 2>&1的意思
在脚本里经常看到 ./xxx.sh > /dev/null 2>&1 ./xxx.sh > log.file 2>&1 在shell中输入输出都有对应的文件描述 ...
- 记一次 .NET 某物管后台服务 卡死分析
一:背景 1. 讲故事 这几个月经常被朋友问,为什么不更新这个系列了,哈哈,确实停了好久,主要还是打基础去了,分析 dump 的能力不在于会灵活使用 windbg,而是对底层知识有一个深厚的理解,比如 ...
- NC20439 [SHOI2017]期末考试
NC20439 [SHOI2017]期末考试 题目 题目描述 有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布.第 \(i\) 位同学希望在第 \ ...
- 使用纯 CSS 实现超酷炫的粘性气泡效果
最近,在 CodePen 上看到这样一个非常有意思的效果: 这个效果的核心难点在于气泡的一种特殊融合效果. 其源代码在:CodePen Demo -- Goey footer,作者主要使用的是 SVG ...
- day11 - 多线程
1内容 进程.线程介绍 Java中 线程的实现方式 Thread 类 Runnable 接口 Callable 接口 线程相关的方法 线程安全问题 - 同步技术 线程等待唤醒机制 进程(Process ...
- 【cartographer_ros】六: 发布和订阅路标landmark信息
上一节介绍了陀螺仪Imu传感数据的订阅和发布. 本节会介绍路标Landmark数据的发布和订阅.Landmark在cartographer中作为定位的修正补充,避免定位丢失. 这里着重解释一下Land ...
- 【一知半解】synchronied
synchronized是什么 synchronized是java同步锁,同一时刻多个线程对同一资源进行修改时,能够保证同一时刻只有一个线程获取到资源并对其进行修改,因此保证了线程安全性. synch ...
- nginx 日志按日期分隔
#user nobody; user root; worker_processes 1; error_log /spdblogs/nginx/logs/error.log; error_log /sp ...
- 160_技巧_Power BI 新函数-计算工作日天数
160_技巧_Power BI 新函数-计算工作日天数 一.背景 Power BI 2022 年 7 月 14 日更新了最新版本的,版本号为:2.107.683.0 . 更多更新内容可以查看官方博客: ...
- 2022-7-9 html 第七组 刘昀航
一.基础认知 1.1 认识网页 网页的组成: 文字.图片.音频.视频.超链接 网页背后的本质:前端程序员写的代码 前端的代码通过什么软件转换成用户眼中的页面:浏览器转化(解析和渲染) 1.2 5大 ...