加速SQL Server 2005的删除?

时间:2010-07-15 06:55:12

标签: performance sql-server-2005 sql-delete

我在类似主题上看到的大多数问题都涉及如何加速插入表格。

我想知道如何加快删除速度?

我不能截断或删除表格,我必须做类似于

的操作
DELETE FROM table WHERE id IN (SELECT id FROM other_table)

5 个答案:

答案 0 :(得分:1)

您的案例没有特别的帮助,因为它取决于。

一般规则(如适用):

  1. 拥有table.id
  2. 的非聚集索引
  3. 但是删除所有其他键/索引从不或很少使用
  4. 删除操作前删除所有其他键/索引,然后重建它们
  5. 避免使用table.id
  6. 的custered索引
  7. 使用索引加速“SELECT id FROM other_table”(假设这个子选择在现实世界中有任何类型的where子句)

答案 1 :(得分:1)

要遵循的一些一般性想法。

  • 确保不要从具有聚集索引的列中删除。
  • 确保行中的其他列具有键或索引。
  • 确保您没有在选择部分中选择大量记录。

除此之外,它只是一个主观猜测,是什么导致你的减速。最好的办法是尝试一些事情,看看有什么帮助,什么使它变慢,了解如何在调用删除时找到行中的项目,并查看最长的内容。

答案 2 :(得分:1)

  • 批处理
  • 使用EXISTS
  • 确保两个表中的id都有正确的索引

示例:

SELECT 'Starting'
WHILE ROWCOUNT <> 0
    DELETE TOP (1000000) T
    FROM  table T
    WHERE EXISTS (
        SELECT * from otherTable OT WHERE T.id = OT.id
    )

也许有些灵感:Bulk DELETE on SQL Server 20087 billion row delete

答案 3 :(得分:0)

“table”是否在“id”列上有索引?
如果没有,SQL Server可能会进行表扫描以查找要删除的记录。您可以通过在“id”列上创建索引来加快速度。

与“other_table”相同 - 如果该表上的选择也有WHERE子句,请检查其中使用的列是否已编入索引。

答案 4 :(得分:0)

以较小的批次删除,例如一次删除1000条记录。实际的删除需要更长的时间(确保有所需的索引),但在长时间运行的删除运行时,用户不会被锁定在表外。