首页 > 数据库 >postgresql 常用的删除重复数据方法

postgresql 常用的删除重复数据方法

时间:2023-08-03 09:45:04浏览次数:41  
标签:deltest postgresql 删除 重复 ctid where id select

一、 最高效方法

测试环境验证,6600万行大表,删除2200万重复数据仅需3分钟

delete from deltest a where a.ctid = any(array (select ctid from (select row_number() over (partition by id), ctid from deltest) t where t.row_number > 1));

 

-- family_no 相同的数据,保留id 最小的,其他的删除。相当于把dcy_family表中的数据删掉一半
delete from dcy_family a 
where a.id = any(array (select id from (select row_number() over (partition by family_no), id from dcy_family) t where t.row_number > 1))

 

 

1. 常规删除方法

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

explain analyse delete from deltest a where a.ctid <> (select min(t.ctid) from deltest t where a.id=t.id);

可以看到,id相同的数据,保留ctid最小的,其他的删除。相当于把deltest表中的数据删掉一半,耗时达到67s多。相当慢。

 

2. group by删除方法

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

explain analyse delete from deltest a where a.ctid not in (select min(ctid) from deltest group by id);

可以看到同样是删除一半的数据,使用group by的方式,时间节省了一半。但仍含需要30s,下面试一下第三种删除操作。

 

3. 高效删除方法

explain analyze delete from deltest a where a.ctid = any(array (select ctid from (select row_number() over (partition by id), ctid from deltest) t where t.row_number > 1));

可以看到,只要98ms

 

标签:deltest,postgresql,删除,重复,ctid,where,id,select
From: https://www.cnblogs.com/Fooo/p/17602429.html

相关文章

  • postgresql database basis
    postgresqlbasisthesystemcatalogtablesofpsotgresqlincludethefollowingtables:pg_databases:containsinformationabout alldatabases,suchasdatabasename,owner,characterset,etcpg_tablespace: containsinformationaboutalltablespaces,suc......
  • delete_by_query删除数据(python)
     fromelasticsearchimportElasticsearchimportos,json,urllib,datetime,shutil,random,uuidimporttimeimportrandomfromelasticsearchimporthelpersfromrandomimportchoiceif__name__=='__main__':print("开始时间:"+time.s......
  • SPSS批量删除含有缺失值的个案
     1.对于上面数据中的ba002_1变量,先点击数据,然后选择选择个案  2.选择如果条件满足,然后选择缺失值函数Sysmis,Sysmis函数的用法如下:SYSMIS(numvar)逻辑。如果numvar的值为系统缺失值,则返回1或true。参数numvar必须为工作数据文件中某个数值变量的名称。这里我们如果......
  • 18.vector越界访问下标,map越界访问下标?vector删除元素时会不会释放空间?
    18.vector越界访问下标,map越界访问下标?vector删除元素时会不会释放空间?1.vector越界访问下标std::vector是C++标准库中的一种动态数组,其大小可以根据需要进行调整。当你试图访问一个不存在的元素,即访问超出其当前大小范围的索引时,将会发生越界访问。在C++中,如果你使用operator[......
  • 2023-08-02:给定一棵树,一共有n个点, 每个点上没有值,请把1~n这些数字,不重复的分配到二叉
    2023-08-02:给定一棵树,一共有n个点,每个点上没有值,请把1~n这些数字,不重复的分配到二叉树上,做到:奇数层节点的值总和与偶数层节点的值总和相差不超过1。返回奇数层节点分配值的一个方案。2<=n<=10^5。来自腾讯音乐。答案2023-08-02:大致步骤如下:1.计算出1到n的总和s......
  • 2023-08-02:给定一棵树,一共有n个点, 每个点上没有值,请把1~n这些数字,不重复的分配到二叉
    2023-08-02:给定一棵树,一共有n个点,每个点上没有值,请把1~n这些数字,不重复的分配到二叉树上,做到:奇数层节点的值总和与偶数层节点的值总和相差不超过1。返回奇数层节点分配值的一个方案。2<=n<=10^5。来自腾讯音乐。答案2023-08-02:大致步骤如下:1.计算出1到n的总和sum。2.确......
  • Merkle 树——看来要求数据不重复
    Merkle树结构  默克尔树(又叫哈希树)是一种典型的二叉树结构,由一个根节点、一组中间节点和一组叶节点组成。默克尔树最早由MerkleRalf在1980年提出,曾广泛用于文件系统和P2P系统中。其主要特点为: 最下面的叶节点包含存储数据或其哈希值。 非叶子节点(包括中间节点和根节点)......
  • 剑指 Offer 03. 数组中重复的数字(简单)
    题目;classSolution{public:intfindRepeatNumber(vector<int>&nums){intresult;unordered_set<int>set;//利用集合寻找重复的数字for(auton:nums){if(set.find(n)==set.end()){//如果set里没找到就加入set......
  • postgresql 配置相关
    配置含义32->192.168.1.1/32表示必须是来自这个IP地址的访问才合法;24->192.168.1.0/24表示只要来自192.168.1.0~192.168.1.255的都合法;16->192.168.0.0/16表示只要来自192.168.0.0~192.168.255.255的都合法;8->192.0.0.0/16表示只要来自192.0.0.0~192.255.......
  • 代码随想录算法训练营第四十三天| 583. 两个字符串的删除操作 72. 编辑距离
    583.两个字符串的删除操作要求:删除最少的步数,来让这两个字符串相等思路:求末尾的最长公共子序列的长度,然后减去他们的长度代码:1//要求:两个字符串,删除任意一个字符后,让这两个字符相等2//dp[n][m]以n-1结尾的字符串变成节点为m-1为子序列的最大个数3//4//求......