PostgreSQL删除重复数据的几种方法

0    900    8

Tags:

👉 本文共约1030个字,系统预计阅读时间或需4分钟。

Oracle 去重的方法很多,常用的是根据 rowid 进行去重,PostgreSQL 如何去除单表重复数据呢?可以通过 ctid 进行,下面是实验过程。

一般方法示例

一、创建测试表

二、插入测试数据

三、查询初始化数据

查询重复数据数:

查询出 id 为1的记录有3条,id 为2的记录有2条。

四、查询要保留的数据

以 min(ctid) 或 max(ctid) 为准。

五、删除重复数据

六、查看最后结果

说明:如果表中已经有标明唯一的序列主键值,可以把该值替换上述的ctid直接删除。

优化方法

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

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

常规删除方法(非常不推荐)

最容易想到的方法就是判断数据是否重复,对于重复的数据只保留ctid最小(或最大)的那条数据,删除其他的数据。

可以看到,id相同的数据,保留ctid最小的那条,其他的删除。

跑了15分钟,没运行出结果,我取消了!!!

group by删除方法

第二种方法为group by方法,通过分组找到ctid最小的数据,然后删除其他数据。

可以看到,使用group by的方式,跑了2分。

分析函数

下面试一下第三种删除操作。

800毫秒,1秒不到就跑完了,是不是超级快!!!

总结

1、使用如下命令删除是最快速的方法:

2、以下方法对于大数据量时效率不好:

3、更优化的方法

更优化的方法就是减少数据扫描的块数,例如,对于此案例,可以加上where条件where id<=10000,可以修改为如下SQL:

执行时间:

可以看到,加上where后,这2种时间差不多。

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部