如何在postgresql中删除重复数据

  介绍

这篇文章将为大家详细讲解有关如何在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中删除重复数据