DELETE edms_personalisation
WHERE mail_id NOT IN (SELECT mail_id
FROM edms_mail)
AND rownum <= 25000;
您好,上面的 SQL(从 SQLPLUS 接口(interface)运行)可以用更高效的方式编写吗?
我最近收到通知,edms_personalization 表大约有 8000 万行,edms_mail 表大约有 120,000 行。
我想创建一个清晰的脚本,每次运行只影响有限数量的行,这样我就可以将它粘贴到 Cron Job 上并让它每 5 分钟左右运行一次。
欢迎任何想法。
(注意:数据库表上确实存在适当的索引)
最佳答案
DELETE edms_personalisation p
WHERE NOT EXISTS (SELECT 'X'
FROM edms_mail m
WHERE m.mail_id = p.mail_id)
AND rownum <= 25000;
或
DELETE edms_personalisation
WHERE mail_id IN (SELECT mail_id FROM edms_personalisation
MINUS
SELECT mail_id FROM edms_mail)
AND rownum <= 25000;
如果是 Oracle,我会编写一个 PL/SQL
来批量收集所有要删除的合格邮件 ID。并直接执行 FORALL DELETE 查询索引(批量绑定(bind))。您也可以批量执行。
否则,由于“要删除”的表太大,明智的做法是将好的数据复制到临时表中,截断该表,然后从临时表中重新加载。当需要频繁循环的时候,就得用上面的方法了!
试试这个!祝你好运!
关于SQL删除查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20759390/