【发布时间】:2018-04-12 11:59:05
【问题描述】:
我有一个充满 GUID ##TempCleanseTheseCustomers 的临时表。
我想删除几个相关的表到一个客户表。大约 30 个相关表。下面是一些例子:
Delete from AddressHistory
Where CustomerId in (select CustomerId From ##TempCleanseTheseCustomers)
Delete from Address
Where CustomerId in (select CustomerId From ##TempCleanseTheseCustomers)
DECLARE @MessageMessageId uniqueidentifier
set @MessageMessageId =
(
SELECT TOP (1) Message.MessageId
FROM Customer INNER JOIN
CustomerMessage ON Customer.CustomerId =
CustomerMessage.CustomerId INNER JOIN
Message ON CustomerMessage.MessageId =
Message.MessageId
Where Customer.CustomerId in (select CustomerId From
##TempCleanseTheseCustomers)
)
Delete from MessageAttachment
Where MessageId = @MessageMessageId
Delete from Message
Where MessageId = @MessageMessageId
如何让这个运行尽可能快? (##TempCleanseTheseCustomers 包含超过 200 万行)
我已尝试将表格移动到内存中。通过 C# 代码等运行它。
【问题讨论】:
-
确保您的删除没有被其他语句阻塞,并且删除表在 CustomerId 上有索引(最好是集群)。
-
不是优化提示,而是你没有
Order by和Top?只是一个随机值? -
以合理大小的批量进行。 IE。每次删除不是数百万行,也不是只有一个。
-
这里有一些方法可以做到这一点:stackoverflow.com/questions/24213299/…
-
您的
CustomerId列是否已编入索引?
标签: sql sql-server performance