使用过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 机制比较的更多相关文章

  1. sql中 truncate 、delete与drop区别

    相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句(数据定义语言),执行后会自动提交. 不同点: 1. t ...

  2. truncate 、delete与drop区别

    原博文地址:http://www.cnblogs.com/8765h/archive/2011/11/25/2374167.html 相同点: 1.truncate和不带where子句的delete. ...

  3. sql语句中----删除表数据drop、truncate和delete的用法

    sql语句中----删除表数据drop.truncate和delete的用法 --drop drop table  tb   --tb表示数据表的名字,下同 删除内容和定义,释放空间.简单来说就是把整 ...

  4. [转]mysql drop、truncate和delete比较

    一.drop table tb drop将表格直接删除,没有办法找回. 立刻释放磁盘空间 ,不管是 Innodb和MyISAM . 二.truncate (table) tb 该命令可以清空一个表里的 ...

  5. truncate与delete的区别

    TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源 ...

  6. sql之truncate 、delete与drop区别

    sql之truncate .delete与drop区别相同点:truncate 和不带 where 子句的 delete,以及 drop 一定会删除表内的数据不同点:1. truncate 和 del ...

  7. 删除表数据drop、truncate和delete的用法

    说到删除表数据的关键字,大家记得最多的可能就是delete了 然而我们做数据库开发,读取数据库数据.对另外的两兄弟用得就比较少了 现在来介绍另外两个兄弟,都是删除表数据的,其实也是很容易理解的 老大- ...

  8. sql server 中删除表中数据truncate和delete的区别(转载自.net学习网)

    我们都知道truncate table可以用来删除整个表的内容,它与delete后面不跟where条件的效果是一样.但除此之外,我们还清楚它们之间有其它的区别吗?本章我们将一起讨论truncate与d ...

  9. TRUNCATE,DORP,DELETE

    TRUNCATE,DORP,DELETE 相同点: truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: 1. truncate和 delete只删除数据不删 ...

随机推荐

  1. 安装@parcel/transformer-image注意的问题

    安装前配置 npm config get cache 键入以上命令即可找到npm缓存路径,然后找到路径下的_libvips文件夹. 一般需要以下两个文件,这里以win环境为例.把文件放到_libvip ...

  2. 基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  3. SQL语句的整理

    mysql语句的整理 1.SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法.但是 SQ ...

  4. Python|range函数用法完全解读

    写在前面的一些过场话: 迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代器的系列文章中(链接见文末),我至 ...

  5. Python之枚举法解数学题

    作为初二的学生,数学题总是令我苦恼的问题.尤其是我们这里的预备班考试(即我们这里最好的两所高中提前一年招生,选拔尖子生的考试)将近,我所面对的数学题越发令人头疼. 这不,麻烦来了: 如图,在正方形AB ...

  6. 抓包整理外篇——————autoResponder、composer 、statistics [ 三]

    前言 经过了前文的介绍的部分已经能够为自己抓包提供一个舒适的环境了,但是舒服的拿到我们的包后,可能有些需求还是难以搞定,fiddler 提供了我们一些其他模块,让我们工作轻松,请往下看. 正文 aut ...

  7. Day04 HTML标记

    路径 ./ 同级目录 ./ 进入该目录名下 ../ 上一级目录 HTML标记 图片 <!-- 图片标记 src 图片的路径 width 设置图片宽度 height 设置图片高度 title 鼠标 ...

  8. 方法引用(Method References)

    * 方法引用的使用 * * 1.使用情境:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用! * * 2.方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口 ...

  9. 循环控制-break语句和continue语句

    break关键字的用法有常见的两种: 1.可以用switch语句当中,一旦执行,整个switch语句立刻结束 2.还可以用在循环语句当中,一定执行,整个循环语句立刻结束,打断循环 关于循环的选择,有一 ...

  10. static 和 final(java)

    static: 1.1static修饰成员变量: 使用static修饰的成员变量不在对象的数据结构,而是类的基本信息(参数) 使用static修饰的成员可以直接使用,类名.成员的方式访问,而不需要再n ...