资讯专栏INFORMATION COLUMN

sql删除重复项并保留其中一条(含sql优化)

nemo / 3141人阅读

摘要:背景数据库包含重复数据,需要清理掉重复数据,并只保留其中一条。经历一段自残式的试错,也终于是实现了。优化后其执行结果如下在优化过程中,还是学习到很多知识,比如和关键字的使用,的语法使用,我尝试过用但没用上。

背景:
数据库包含重复数据,需要清理掉重复数据,并只保留其中一条。
结论
优化:百万数据查询删除重复数据,耗时从5423秒下降到2秒左右
优化过程:

根据搜索到的资料:

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

delete from vitae a 
where (a.peopleId,a.seq) in (select peopleId,seq 
from vitae group by peopleId,seq having count(*) > 1) 
and rowid not in (select min(rowid) from vitae 
group by peopleId,seq having count(*)>1)

根据搜索到的资料,编写第一个版本的sql语句:

delete from lcfyjttz where 
(fdate, ffjdm, flcdm, ffytype, fgsbz) in(
select fdate,ffjdm,flcdm, ffytype, fgsbz 
from lcfyjttz group by fdate,ffjdm,flcdm, ffytype, fgsbz having count(1) > 1) 
and rowid not in(
select min(rowid) as rid from lcfyjttz 
group byfdate,ffjdm,flcdm, ffytype, fgsbz having count(1) > 1 )

百万数据量的情况下,其执行结果如下:

看这个sql的执行结果就很吓人,作为一个追求3秒级的人,简直忍受不了,开始尝试优化这条sql。经历一段自残式的试错,也终于是实现了。

优化后sql:

DELETE 
FROM
    LCFYJTTZ c 
WHERE
    EXISTS (
        SELECT
            a.ROWID 
        FROM
            LCFYJTTZ a,
            (
            SELECT
                fdate,
                ffjdm,
                flcdm,
                ffytype,
                fgsbz,
                MIN( ROWID ) rid 
            FROM
                lcfyjttz 
            GROUP BY
                fdate,
                ffjdm,
                flcdm,
                ffytype,
                fgsbz 
            HAVING
                count( 1 ) > 1 
            ) b 
        WHERE
            a.FDATE = b.FDATE 
            AND a.FFJDM = b.FFJDM 
            AND a.FLCDM = b.FLCDM 
            AND a.ffytype = b.FFYTYPE 
            AND a.ROWID != b.rid
            AND c.ROWID = a.ROWID 
    )

其执行结果如下:


在优化过程中,还是学习到很多知识,比如in和exists关键字的使用,with...as的语法使用,我尝试过用但没用上。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/35367.html

相关文章

  • sql删除重复项并保留其中一条sql优化

    摘要:背景数据库包含重复数据,需要清理掉重复数据,并只保留其中一条。经历一段自残式的试错,也终于是实现了。优化后其执行结果如下在优化过程中,还是学习到很多知识,比如和关键字的使用,的语法使用,我尝试过用但没用上。 背景: 数据库包含重复数据,需要清理掉重复数据,并只保留其中一条。 结论 优化:百万数据查询删除重复数据,耗时从5423秒下降到2秒左右 优化过程: 根据搜索到的资料: 4、删除表...

    Jeff 评论0 收藏0
  • sql删除重复项并保留其中一条sql优化

    摘要:背景数据库包含重复数据,需要清理掉重复数据,并只保留其中一条。经历一段自残式的试错,也终于是实现了。优化后其执行结果如下在优化过程中,还是学习到很多知识,比如和关键字的使用,的语法使用,我尝试过用但没用上。 背景: 数据库包含重复数据,需要清理掉重复数据,并只保留其中一条。 结论 优化:百万数据查询删除重复数据,耗时从5423秒下降到2秒左右 优化过程: 根据搜索到的资料: 4、删除表...

    newsning 评论0 收藏0
  • MySQL探秘(二):SQL语句执行过程详解

    摘要:表示只有在查询语句中明确写明的语句才会放入查询缓存。查询优化器查询优化器会将解析树转化成执行计划。生成执行计划的过程会消耗较多的时间,特别是存在许多可选的执行计划时。使用基于成本的查询优化器,。 showImg(https://segmentfault.com/img/bVbex5v?w=750&h=562); 昔日庖丁解牛,未见全牛,所赖者是其对牛内部骨架结构的了解,对于MySQL亦...

    baukh789 评论0 收藏0
  • MySQL 【去重留一】一条sql语句完成 思路总结

    摘要:查了资料,请教了大佬之后得出了一个很便利的语句,这里分享下这段语句和思路。需求分析数据库中存在重复记录,删除保留其中一条是否重复判断基准为多个字段解决方案碰到这个需求的时候,心里大概是有思路的。 原文是在我自己博客中,小伙伴也可以点阅读原文进行跳转查看,还有好听的背景音乐噢~     前几天在做一个需求的时候,需要清理mysql中重复的记录,当时的想法是通过代码遍历写出来,然后觉得太复...

    stormgens 评论0 收藏0
  • MySQL 【去重留一】一条sql语句完成 思路总结

    摘要:查了资料,请教了大佬之后得出了一个很便利的语句,这里分享下这段语句和思路。需求分析数据库中存在重复记录,删除保留其中一条是否重复判断基准为多个字段解决方案碰到这个需求的时候,心里大概是有思路的。 原文是在我自己博客中,小伙伴也可以点阅读原文进行跳转查看,还有好听的背景音乐噢~     前几天在做一个需求的时候,需要清理mysql中重复的记录,当时的想法是通过代码遍历写出来,然后觉得太复...

    wua_wua2012 评论0 收藏0

发表评论

0条评论

nemo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<