【问题标题】:DELETE performance in SQL Server on clustered index, large tableSQL Server 在聚集索引、大表上的 DELETE 性能
【发布时间】:2011-09-18 15:16:43
【问题描述】:

我有一个超过 2000 万行的表,当我这样做时:

DELETE [Table] WHERE ID = ?

需要 40 多秒。 ID 列是聚集的。

这是你所期望的吗?还是可以优化一下?

【问题讨论】:

    标签: sql-server performance clustered-index


    【解决方案1】:

    还可以尝试批量删除数据。示例

    set rowcount 10000
    delete [table] where id = ? 
    while @@rowcount >0
    begin
    delete [table] where id = ? 
    end
    

    【讨论】:

    • 这通过减少锁定时间和表/索引的争用来提高并发性。但它可能不会提高性能。
    【解决方案2】:

    除了 JNK 在他们的回答中包含的要点之外,我看到的一个特殊杀手是当您从一个或多个外键约束的引用表中删除行时,以及引用表未编入索引 - 您强制对每个表进行表扫描,然后才能接受删除。

    【讨论】:

    • 问题是相关表上的索引没有外键索引。这使得删除速度很慢。为外键列在所有相关表上创建索引,删除耗时 0 秒。
    • 是的,添加索引对我们的问题产生了重大影响。但是,具有讽刺意味的是,简单地运行“UPDATE STATISTICS [tableName]”也是如此。值得一试。
    【解决方案3】:

    这将取决于很多你没有告诉我们的因素......

    删除了多少行?更多的行显然意味着更多的时间。

    还有其他索引吗?每个索引都需要更新,而不仅仅是集群索引。如果您要删除 10 个索引,则大约需要 10 倍的时间(非常粗略)。

    还有其他活动吗?如果发生更新或插入,则很可能存在等待和争用。

    一般来说,操作所需的秒数高度取决于您的硬件设置。如果您在台式机上运行此程序,而不是在具有高性能阵列和 12 个内核的服务器上运行,那么预期会大不相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-04
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 2011-11-30
      • 1970-01-01
      • 2010-11-04
      相关资源
      最近更新 更多