【发布时间】:2021-07-22 16:20:50
【问题描述】:
我需要删除 90% 的表格。
我正在循环执行此语句(以保持事务较小)
DELETE TOP(1000)
FROM Events
WHERE EventID IN (SELECT EventId FROM EventsToDelete)
两个表都有大约 5000 万行。
此语句的查询计划是两次索引扫描,这并不快。我可以采用哪些策略来加快整个过程?
其他表有对该表的 FK 引用。
【问题讨论】:
-
“其他表有对该表的 FK 引用。” 这些是否也有级联?如果没有,您最好删除
CONSTRAINTs、INSERTing 要保留到新表中的数据(具有相同的定义)、DROPing 现有表、重命名新表以及然后重新创建CONSTRAINTs。如果他们这样做了,那么您要删除的不仅仅是 45M~ 行,而是相关表中的所有行;这很可能需要一些时间。 -
我认为这可行,但我不喜欢放弃约束,因为这假设我知道所有约束并且我希望代码能够工作,即使设置了新的约束......我猜没有别的办法?
-
您可以创建一个新表并从源表中插入 10%。然后删除源表。
-
@SteveC 即使有约束?
-
删除约束并在之后重新创建它们。你可能会发现这个答案很有用stackoverflow.com/questions/66427736/…,它解释了如何快速切换数据。
标签: sql-server query-optimization