介绍
这篇文章将为大家详细讲解有关如何在postgresql中删除重复数据,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
首先创建一张基础表,并插入一定量的重复数据。
,,测试=#,create table 解决(id , int, name varchar (255)); CREATE 才能;表 测试=#,才能create table deltest_bk (like 解决); CREATE 才能;表 测试=#,才能insert into deltest select generate_series (1, 10000), & # 39; ZhangSan& # 39;; ,INSERT 0, 10000 测试=#,才能insert into deltest select generate_series (1, 10000), & # 39; ZhangSan& # 39;; ,INSERT 0, 10000 测试=#,才能insert into deltest_bk select *,得到解决;
常规删除方法
最容易想到的方法就是判断数据是否重复,对于重复的数据只保留ctid最小(或最大)的那条数据,删除其他的数据。
测试=#,explain analyse delete 得到deltest a where a.ctid & lt;祝辞,(select min (t.ctid),得到deltest t where a.id=t.id); ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,QUERY 计划 ,,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Delete 才能提醒deltest a (成本=0.00,195616.30,行=1518,宽度=6),(actual 时间=67758.866,67758.866,行=0,循环=1) ,,,,,Seq Scan 提醒deltest a (成本=0.00,195616.30,行=1518,宽度=6),(actual 时间=32896.517,67663.228,行=10000,循环=1) ,,,,过滤器:,(ctid & lt;祝辞,(SubPlan 1)) ,,,,Rows Removed by 过滤器:10000 ,,,,SubPlan 1 ,,,,,,,Aggregate (成本=128.10,128.10,行=1,宽度=6),(actual 时间=3.374,3.374,行=1,循环=20000) ,,,,,,,,,,Seq Scan 提醒deltest t (成本=0.00,128.07,行=8,宽度=6),(actual 时间=0.831,3.344,行=2,循环=20000) ,,,,,,,,,,,过滤器:,(=a.id id) ,,,,,,,,,,,Rows Removed by 过滤器:19998 Total 才能;运行时:67758.931,ms 测试=#,才能select count(*),得到解决; ,计数 ,- - - - - - - ,10000年 (1),才能行记录)
可以看的到,id相同的数据,保留ctid最小的那条,其他的删除。相当于把解决表中的数据删掉一半,耗时达到67年代多。相当慢。
group by删除方法
第二种方法为集团的方法,通过分组找到ctid最小的数据,然后删除其他数据。
,,测试=#,truncate table 解决; TRUNCATE 才能;表 测试=#,才能insert into deltest select *,得到deltest_bk; ,INSERT 0, 20000 测试=#,才能explain analyse delete 得到deltest a where a.ctid not 拷贝(select min (ctid),得到deltest group by id); ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,QUERY 计划 ,,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Delete 才能提醒deltest a (成本=131.89,2930.46,行=763,宽度=6),(actual 时间=30942.496,30942.496,行=0,循环=1) ,,,,,Seq Scan 提醒deltest a (成本=131.89,2930.46,行=763,宽度=6),(actual 时间=10186.296,30814.366,行=10000,循环=1) ,,,,过滤器:,(NOT (SubPlan 1)) ,,,,Rows Removed by 过滤器:10000 ,,,,SubPlan 1 ,,,,,,,Materialize (成本=131.89,134.89,行=200,宽度=10),(actual 时间=0.001,0.471,行=7500,循环=20000) ,,,,,,,,,,HashAggregate (成本=131.89,133.89,行=200,宽度=10),(actual 时间=10.568,13.584,行=10000,循环=1) null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null如何在postgresql中删除重复数据