【问题标题】:Speed up deletions on SQL Server 2005?在 SQL Server 2005 上加快删除速度?
【发布时间】:2010-07-15 06:55:11
【问题描述】:

我在类似主题上看到的大多数问题都与如何加快插入表格的速度有关。

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

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

DELETE FROM table WHERE id IN (SELECT id FROM other_table)

【问题讨论】:

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


    【解决方案1】:

    对于您的情况没有具体的帮助,因为这取决于。

    一般规则(如适用):

    1. table.id 有一个非聚集索引
    2. 但删除所有其他从未或很少使用的键/索引
    3. 在删除操作之前删除所有其他键/索引并在之后重建它们
    4. 避免 table.id 的托管索引
    5. 使用索引加速“SELECT id FROM other_table”(假设此子选择在现实世界中具有任何类型的 where 子句)

    【讨论】:

      【解决方案2】:

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

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

      除此之外,这只是对导致您减速的原因的主观猜测。最好的办法是尝试一下,看看什么有帮助,什么使它变慢,了解如何在调用删除时找到行中的项目,并查看那里花费的时间最长。

      【讨论】:

        【解决方案3】:
        • 批量处理
        • 使用 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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-09-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-19
              • 2018-07-12
              • 1970-01-01
              相关资源
              最近更新 更多