【问题标题】:SQL performance on many deletes许多删除的 SQL 性能
【发布时间】: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 byTop?只是一个随机值?
  • 以合理大小的批量进行。 IE。每次删除不是数百万行,也不是只有一个。
  • 这里有一些方法可以做到这一点:stackoverflow.com/questions/24213299/…
  • 您的CustomerId 列是否已编入索引?

标签: sql sql-server performance


【解决方案1】:

您可以检查##TempCleanseTheseCustomers 上没有重复记录,并检查其他几个表上是否存在索引和键

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 2011-07-01
    • 2012-07-19
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多