SQL删除查询优化

标签 sql query-optimization sqlplus sql-delete

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/

相关文章:

mysql - 优化查询,花费更多时间执行

mysql - 这是优化 MySQL 查询的正确方法吗?

php - 初学者在表单处理方面遇到困难 - 无法将数据发布到 MySQL DB

sql - 部署期间添加辅助数据库数据

sql - 如何通过在 MSSQL 中使用 Pivot with Month 获取评级列的值及其对每个特定月份的定义

mysql - 优化 ORDER BY 查询

sql - 当您不知道上限时如何使用聚合案例语句而不是 PIVOT?

oracle - Ansible playbook 执行 Oracle 脚本

Python 使用 Seaborn 绘制 Pandas SQL 数据框

sql - 监控长时间运行的 PL/SQL block