ORACLE删除重复记录求优化

0
DELETE
    FROM   "table"
    WHERE  "RowID" NOT IN (SELECT MAX("RowID")
                         FROM   "table"
                         GROUP BY
                                "aaa",
                                "bbb",
                                "ccc"
                         HAVING COUNT(*) >= 1);

很普通的一条去重复语句,但是当数据量大时(两三万条记录),执行时间要几个小时,但这时执行括号内的查询很快
求优化方案
已邀请:
1

老头子 - 专注是唯一的捷径 2015-10-22 回答

发下你的执行计划,看下是不是发生了视图合并?
2、3w的数据量不大
 
还有最好不要group by那几个字段
DELETE
    FROM   "table"
    WHERE  "RowID" NOT IN (SELECT MAX("RowID")
                         FROM   "table"
                         GROUP BY
                                "aaa",
                                "bbb",
                                "ccc"
                         HAVING COUNT(*) >= 1);
可以把group by换成表关联,group by 和 having 效率较低。
DELETE
    FROM   "table" a
    WHERE  "RowID" NOT IN (SELECT MAX("RowID")
                         FROM   "table" b
                         where a.aaa = b.aaa and
                               a.bbb = b.bbb and
                               a.ccc = b.ccc
                          );
 
ps: 在关联的时候注意对空值的处理
0

seng - 从事BI、大数据、数据分析工作 2015-10-22 回答

使用临时表吧。

要回复问题请先登录注册