首页 > 其他分享 >KingbaseES删除重复数据的方法

KingbaseES删除重复数据的方法

时间:2024-04-03 17:14:21浏览次数:22  
标签:rows .. 删除 重复 where del ctid KingbaseES id

前言

Oracle数据库去除重复数据方法一般根据rowid进行去重,KingbaseES数据库如何去重呢?可以根据ctid去重。
我们使用大数据量测试,因为一般生产环境数据量还是蛮大的。

测试

创建一张测试表,并插入一定量的重复数据,数据量21万,其中重复数据1万。

create table del(id int, name varchar(255)); 
create table del2 (like del); 
create table del3 (like del);
insert into del select generate_series(1, 200000), 'WangSi'; 
insert into del select generate_series(1, 10000), 'WangSi'; 

查看重复数据

TEST=# select count(*) from del where id<=10000;
 count
-------
 20000
(1 row)

复制del表

insert into del2 select * from del; 
insert into del3 select * from del2; 

checkpoint;   
\timing on  

1.常规删除方法
最容易想到的方法就是判断数据是否重复,对于重复的数据只保留ctid最小(或最大)的那条数据,再删除其他的数据。
这种方法不推荐,因为会扫描全表,效率低。执行了3分钟左右没结果取消了操作。

TEST=# delete from del a where a.ctid <> (select min(t.ctid) from del t where a.id=t.id);
^CCancel request sent
ERROR:  canceling statement due to user request
Time: 182937.640 ms (03:02.938)

2.分组删除方法
第二种方法使用group by,通过分组找到ctid最小的数据,然后删除其他数据。
需要注意 group by 需要排序操作,所以我把work_mem参数临时调整为256MB,如果work_mem是默认的4MB,则无法得到结果集,因为排序太耗时,数据量太大。

TEST=# delete from del2 a where a.ctid not in (select min(ctid) from del2 group by id);
DELETE 10000
Time: 250.799 ms

更优化的方法
加上过滤条件减少数据扫描的块数,例如,可以加上条件where id<=10000,如下SQL
这样的写法我们要知道重复数据的范围

TEST=# delete from del3 a where a.ctid in (select min(ctid) from del3 where id<=10000 group by id) and id<=10000;
DELETE 10000
Time: 54.478 ms

从执行计划看,执行计划最先执行子查询里面的id<=10000行记录扫描,总共20000行记录,过滤掉10000行后,对其进行group by,然后进行哈希聚合,
再对这个结果集进行nested loop,子查询外层扫描Tid Scan on del a,结果是1行,循环10000次。这个执行计划是合理的,不过如果子查询内结果集很大,
可能优化器不会选择nested loop方式。而第二种方法同样是group by,但是没有过滤出重复数据,显然需要扫描更多行。有兴趣的朋友可以试一下。

explain analyze delete from del a where a.ctid in (select min(ctid) from del where id<=10000 group by id) and id<=10000;
                                                                   QUERY PLAN

------------------------------------------------------------------------------------------------------------------------------------------------
 Delete on del a  (cost=4305.52..5112.52 rows=1831 width=36) (actual time=56.341..56.344 rows=0 loops=1)
   ->  Nested Loop  (cost=4305.52..5112.52 rows=1831 width=36) (actual time=21.064..33.160 rows=10000 loops=1)
         ->  HashAggregate  (cost=4305.52..4307.52 rows=200 width=36) (actual time=21.040..23.520 rows=10000 loops=1)
               Group Key: "ANY_subquery".min
               ->  Subquery Scan on "ANY_subquery"  (cost=3865.22..4256.60 rows=19569 width=36) (actual time=14.931..18.944rows=10000 loops=1)
                     ->  HashAggregate  (cost=3865.22..4060.91 rows=19569 width=10) (actual time=14.926..17.090 rows=10000 loops=1)
                           Group Key: del.id
                           ->  Seq Scan on del  (cost=0.00..3767.00 rows=19644 width=10) (actual time=0.023..11.505 rows=20000 loops=1)
                                 Filter: (id <= 10000)
                                 Rows Removed by Filter: 190000
         ->  Tid Scan on del a  (cost=0.00..4.02 rows=1 width=6) (actual time=0.000..0.001 rows=1 loops=10000)
               TID Cond: (ctid = "ANY_subquery".min)
               Filter: (id <= 10000)
 Planning Time: 0.133 ms
 Execution Time: 56.472 ms
(15 rows)

Time: 61.553 ms

标签:rows,..,删除,重复,where,del,ctid,KingbaseES,id
From: https://www.cnblogs.com/kingbase/p/17736781.html

相关文章

  • KingbaseESV8R6等待事件之LWLockBuffer_IO
    说明当并发会话尝试访问同一页面时,等待其他进程完成其输入/输出(I/O)操作时,就会发生LWLock:BufferIO事件。其目的是将同一页读取到共享缓冲区中。等待事件发生过程每个sharedbuffer都有一个与LWLock:BufferIO等待事件关联的I/O锁,每次都必须在共享缓冲池外检索块。此锁用于处理......
  • 如何查看KingbaseES数据库占用操作系统内存情况
    当遇到数据库内存告警,并且操作系统内存使用不足,需要分析内存占用的方法。KingbaseES数据库使用操作系统缓存机制,大量的内存很可能被BUFFER/CACHE占用了。从free命令可以看到总共有2.5G多内存,使用了291MB,free剩下1.7GB多,BUFF/CACHE占了474MB。available有1.3GB多,当前这台数据库服......
  • KingbaseES数据库权限简写说明
    前言为了方便,我们测试环境经常使用system用户执行测试,它拥有最高权限。角色基本上是用户和组的概念。你可以以角色身份登录,并且一个角色可以属于另一个角色。每个角色都有一个类似的属性,指示你是否可以作为该角色登录,以及该角色是否从所属角色继承权限。你可以使用命令将角色添......
  • KingbaseES复制冲突中谁阻塞walreplay
    背景回顾一下流复制冲突相关参数:hot_standby_feedback:从库反馈给主库快照,主库vacuum时不回收最老快照之后产生的垃圾,注:备库长查询将导致主库表膨胀。vacuum_defer_cleanup_age:当触发vacuum时,延迟指定事务后触发。recovery_min_apply_delay:如果将此参数设置为5分钟,则只......
  • KingbaseES 数据库创建索引慢的可能原因
    1.表大小如果表太大,数据很多,索引创建的时候,会导致创建索引的时间很慢。如果表很大,可以考虑重新设计表结构或拆分表。还可以考虑使用分区表,使子分区的数据减少,创建分区表也可以使索引变小,增加索引创建速度,有助于查询效率。2.索引类型不同类型的索引建立的速度可能会有所不同,因......
  • KingbaseES 数据库IO优化方向总结
    前言数据库中的IO性能是优化中的重中之重,根据木桶原理,解决了IO这个最容易引起业务堵塞的问题,就能解决绝大部分性能问题。下面从几个方面总结一下I/O优化问题。第一,使用相对速度快的高性能存储设备。一般会考虑使用固态硬盘(SSD)或RAID阵列以获得更快的读写速度。高性能低......
  • json字符串重复转义问题
    若后台返回的是一个json字符串格式的值,我们首先做的是先用JSON.parse()转化成json数组,然后再通过点的方式取到里面的值但是在实际使用过程中,会发现有重复转义的问题,第一次操作正常,第二次点击其他按钮后,json字符串前就多了一个\,所以在进行parse之前,要先用replace()去除\ 一、使......
  • GIT删除未受版本控制文件及还原操作
    要删除本地所有未受Git版本控制的文件,可以使用 gitclean 命令。gitclean 命令用于从工作目录中移除未跟踪的文件。请小心使用此命令,因为它会永久删除未跟踪的文件,而不会将其放入暂存区或提交历史中。要删除所有未跟踪的文件,包括目录和子目录中的文件,可以使用以下命令:......
  • Git——删除文件
    目的将文件删除并同步到远程库步骤1.在工作区文件夹中直接删除对应文件(工作区操作)2.输入gitstatus指令确认暂存区的状态3.输入gitadd.指令来同步暂存区的状态(暂存区操作:删除文件)4.再次输入gitstatus指令确认暂存区的状态,确认该文件已被删除5.使用gitcommit-m"注......
  • 金蝶云星空表单插件:操作子单据体的删除触发父单据体的字段重算
    文章目录金蝶云星空表单插件:操作子单据体的删除触发父单据体的字段重算金蝶云星空表单插件:操作子单据体的删除触发父单据体的字段重算publicoverridevoidAfterDeleteRow(AfterDeleteRowEventArgse){base.AfterDeleteRow(e);if(e.EntityKey.Equals(as......