【问题标题】:DELETE FROM table becomes heavy as the number of records in table's children increase随着表子项中记录数的增加,DELETE FROM 表变得越来越重
【发布时间】:2015-04-13 13:27:30
【问题描述】:

我有一个名为Campaign 的主表。 Campaign 的 Id 是另一个表 CampaignRun 中的外键,CampaignRun 的 Id 是第三个表 CampaignRecipient 中的外键。由于我的 CASCADE 要求,我正在使用

DELETE FROM Campaign WHERE Id = x

删除有关广告系列的所有相关信息。但是这个函数在服务器上变得非常繁重,并且在运行时当然会锁定表。我想知道是否有更快的方法来处理DELETE FROM。 TRUNCATE 更快,但不幸的是它不接受任何条件。

将不胜感激任何工作建议。

【问题讨论】:

  • 我会做以下事情:stackoverflow.com/a/1433231/1232818
  • 我建议您创建一个temp 表并将需要删除的记录插入ID's 到临时表并使用cursor 删除它们。这样会快得多只需在主表上使用cursor。
  • 老实说,我会停止使用 CASCADE。批量删除children,再删除parent。
  • 您可以在自下而上的交易中执行 3 个单独的 deletes。即删除CampaignRecipient 中受影响的行,然后删除CampaignRun 和Campaign。可能会导致较少的锁定,并且应该更快 IMO。
  • 但同时另一个进程可能正在写入这些表,所以这不是很冒险吗?

标签: sql sql-server database


【解决方案1】:

也许你可以检查一下this,interrupt() 可能就是答案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多