【发布时间】:2015-04-13 13:27:30
【问题描述】:
我有一个名为Campaign 的主表。 Campaign 的 Id 是另一个表 CampaignRun 中的外键,CampaignRun 的 Id 是第三个表 CampaignRecipient 中的外键。由于我的 CASCADE 要求,我正在使用
DELETE FROM Campaign WHERE Id = x
删除有关广告系列的所有相关信息。但是这个函数在服务器上变得非常繁重,并且在运行时当然会锁定表。我想知道是否有更快的方法来处理DELETE FROM。 TRUNCATE 更快,但不幸的是它不接受任何条件。
将不胜感激任何工作建议。
【问题讨论】:
-
我建议您创建一个
temp表并将需要删除的记录插入ID's到临时表并使用cursor删除它们。这样会快得多只需在主表上使用cursor。 -
老实说,我会停止使用 CASCADE。批量删除children,再删除parent。
-
您可以在自下而上的交易中执行 3 个单独的
deletes。即删除CampaignRecipient中受影响的行,然后删除CampaignRun和Campaign。可能会导致较少的锁定,并且应该更快 IMO。 -
但同时另一个进程可能正在写入这些表,所以这不是很冒险吗?
标签: sql sql-server database