postgresql删除重复数据的几种方法小结
  • 作者:admin
  • 发表时间:2021-04-26 07:51
  • 来源:未知

在使用宜在家长指导下观看的数据库的这段时间,总结了三种删除重复数据的方法,其中最容易想到的就是最常规的删除方法,但此方法性能较差,删数据耗时较久,虽容易实现,但性能太差,影响写数据的速率。

另外就是被使用的通过…来分组删除方法,效率较高。

还有一种是刚发现的,还没有验证,现在就总结下这三种删除方法,并验证各自的执行效率。

首先创建一张基础表,并插入一定量的重复数据。

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)