在使用宜在家长指导下观看的数据库的这段时间,总结了三种删除重复数据的方法,其中最容易想到的就是最常规的删除方法,但此方法性能较差,删数据耗时较久,虽容易实现,但性能太差,影响写数据的速率。
另外就是被使用的通过…来分组删除方法,效率较高。
还有一种是刚发现的,还没有验证,现在就总结下这三种删除方法,并验证各自的执行效率。
首先创建一张基础表,并插入一定量的重复数据。
test=# create table deltest(id int,name varchar(255));
创建表格
test=# create table deltest_bk(如del test);
创建表格
test=# insert into deltest select generate _ series(1,10000),' Zhan San ';
插入0 10000
test=# insert into deltest select generate _ series(1,10000),' Zhan San ';
插入0 10000
test=# insert in deltest _ bk select * from deltest;
常规删除方法
最容易想到的方法就是判断数据是否重复,对于重复的数据只保留化疗相关性腹泻最小(或最大)的那条数据,删除其他的数据。
测试=#解释分析从del测试a中删除,其中a . ctid(选择deltest t的最小值(t.ctid)其中a . id=t . id);
铌唐山网络公司sp;查询计划
-
在deltest a上删除(成本=0.00.195616.30行=1518宽=6(实际时间=67758.866.67758.866行=0个循环=1)
deltest a上的序列扫描(成本=0.00.195616.30行=1518宽=6(实际时间=32896.517.67663.228行=10000个循环=1)
Filter: (ctid(子计划1))
过滤器删除的行: 10000
子计划一
-合计(成本=128.10.128.10行=1宽度=6(实际时间=3.374.3.374行=1个循环=20000)
deltest测试时的序列扫描(成本=0.00.128.07行=8宽=6(实际时间=0.831.3.344行=2个循环=20000)
Filter: (a.id=id)
过滤器删除的行: 19998
总运行时间: 67758.931毫秒
测试=#从deltest中选择计数(*);
数
-
10000
(1 行记录)
可以看到,id相同的数据,保留化疗相关性腹泻最小的那条,其他的删除。相当于把deltest表中的数据删掉一半,耗时达到67s多。相当慢。
通过…来分组删除方法
第二种方法为通过…来分组方法,通过分组找到化疗相关性腹泻最小的数据,然后删除其他数据。
test=# truncate table deltest
截断表格
test=# insert in deltest select * from deltest _ bk;
插入0 20000
test=# explain analysis delete from deltest a,其中a.ctid不在(按自我从del测试组中选择min(ctid));
查询计划
-
删除deltest a(成本=131.89.2930.46行=763宽=6(实际时间=30942.496.30942.496行=0个循环=1)