【Oracle SQL】两百万数据的表中名称存在重复,直接删除方案和借助临时表方案比较(删除比例约三成,前者比后者快)
【实验环境】
Oracle11g
【实验对象表及数据】
create table test05( id number(10), name nvarchar2(10), primary key(id) )
充值:
insert into test05 select rownum, dbms_random.string('*',dbms_random.value(1,10)) from dual connect by level<2000001;
充值过程约耗时18秒。
【需求】
如果名称字段存在重复,则删除重复的记录
【备份数据】
因为要实验至少两次,因此做一个临时表test06存储test05的试验记录。
create table test06 as select * from test05;
【第一方案:直接删除】
以下sql能知道哪些名称存在重复
select name from test05 group by name having count(id)>1;
以下SQL能知道多少个名称存在重复
select count(*) from (select name from test05 group by name having count(id)>1);
执行完发现有59605个name有重复值。
直接开始删除
delete from test05 a where exists (select null from test05 b where b.name=a.name and b.id<a.id)
用时约16秒,删除585105行
再用select count(*) from (select name from test05 group by name having count(id)>1);去查,发现结果为0,此说明重复名称的记录已然删除了。
【倒数据,以方便第二次实验】
truncate table test05; insert into test05 select * from test06;
以上两句用时约16秒
【第二方案:借助临时表test07】
看重复情况:
select count(*) from (select name from test05 group by name having count(id)>1);
还是发现59605个name有重复值。这里确认了实验条件一致。
把不存在重复的记录存入临时表
create table test07 as select * from test05 a where not exists (select null from test05 b where b.name=a.name and b.id<a.id)
此句耗时约两秒
再查查test07里的记录数
SQL> select count(*) from test07; COUNT(*) ---------- 1414895 已用时间: 00: 00: 00.08
这里已经和方案一最终结果一致了,其正确性可以相互验证。
再把test5的数据清空,将test7的数据倒回去
truncate table test05; insert into test05 select * from test07;
用时约28秒
由以上实验得知,如果重复数据比例低,那么直接删除要快于临时表方案。
END
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2019-03-04 【Canvas与艺术】"社会主义核心价值观"表盘
2019-03-04 【Canvas与艺术】绘制地平线
2019-03-04 【Canvas与艺术】绘制磨砂黄铜材质Premium Quality徽章
2019-03-04 【Canvas与艺术】绘制蓝色森麒麟轮胎
2016-03-04 【Canvas技法】绘制绘制正五边形、正五角星
2016-03-04 VI使用技巧
2016-03-04 【Canvas与数学】绘制圆形中运动的包络线