【问题标题】:Most Efficient way to delete Records based on Primary key id基于主键 id 删除记录的最有效方法
【发布时间】:2019-01-24 21:47:24
【问题描述】:

我有一个表(table1),它以 id 作为主键并且本质上是增量的。该表具有 Updatedtm,它具有最后更新的日期和时间。该表有大约 3 亿条记录。我有另一个与 table1 同步的表 table2。从 table1 中删除 id 时,从 table2 中删除的最佳方法是什么? Left join 是不是一种有效的方法,我每次都要比较 3 亿条记录来检查删除吗?

Delete from table2
where id not in(Select id from table1)

【问题讨论】:

  • 外部联接或不存在几乎总是比(不)IN 更好。那就是说我建议你测试一下,然后你就会知道。
  • table2和table1同步是什么意思?如果 table2 中的记录在 table1 中没有对应的条目,则听起来这些表不同步。为什么这些表之间没有外键关系?

标签: sql oracle


【解决方案1】:

确保您有一个涵盖此查询的索引。 IE。确保 table1.idtable2.id 已编入索引(是的,即使索引需要更新,拥有此索引也会加快删除速度。)这将有助于 JOIN

另外,您可能希望考虑批量删除,

WHILE <some_condition> BEGIN
    DELETE TOP (1000) t2
    FROM table2 t2
    LEFT OUTER JOIN table1 t1 ON t2.id = t1.id
    WHERE t1.id IS NULL
END

批量删除将减少 SQL Server 必须在表、聚簇和非聚簇索引上取出的锁数。如果这是一个拥有 3 亿行的生产服务器,我肯定会查看您的索引并计算您认为可能要删除的记录数,然后再提出删除策略。

SELECT COUNT(*) FROM table2 t2
LEFT OUTER JOIN table1 t1 ON t2.id = t1.id
WHERE t1.id IS NULL

另外,请联系任何服务器管理员,了解他们对潜在锁定问题的看法。

【讨论】:

    【解决方案2】:

    我建议你使用“Exists”而不是“Not in”

    Delete from table2 t2
    where exists ( select 1 from table1 t1 where t1.id=t2.id)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-10
      • 2014-09-30
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多