【问题标题】:SQL DELETE performanceSQL DELETE 性能
【发布时间】:2010-12-10 11:22:57
【问题描述】:
delete from a A where a.ID = 132.

表A包含大约5000条记录,A.ID是表A中的主键。但是删除需要很长时间。有时它也会超时。该表包含三个索引,并由三个外键引用。谁能解释我为什么即使我们基于主键删除它也需要很长时间。请告诉我一些优化这个问题的方法...?

【问题讨论】:

  • “长时间”是什么意思?任何操作,即使是全表扫描,在 5000 行表上都应该很快。

标签: sql sql-server sql-server-2008 sql-delete


【解决方案1】:

可能的原因:

1) 级联删除操作

2) 触发器

3)您的主键列的类型不是整数,从而强制对每个 pk 值进行类型转换以进行比较。这需要全表扫描。

4) 您的查询真的像您在问题中发布的那样以点结尾吗?如果是这样,该数字可能会被认为是浮点数而不是整数,从而导致类似于3)的类型转换

5) 您的删除查询正在等待其他一些慢速查询来释放锁

【讨论】:

  • 特别是检查级联删除到任何本身被大量索引的大表。
【解决方案2】:

显然它不应该花费很长时间。但是,这里没有足够的信息来找出确切的原因。不过,我可以告诉你,你应该专注于外键。

如果它们对其他更大的表施加约束,它们会减慢速度。您可能还会发现您的超时是由于防止删除的完整性检查造成的(那么问题是为什么您没有收到异常而不是超时)。

我的下一步是删除外键,然后检查性能。然后一次添加每一个,并随时检查性能。

其他操作(例如插入、选择、更新)是否需要很长时间?

【讨论】:

    【解决方案3】:

    第一个想法:外键索引?

    • 这与提到的级联删除有关
    • 必须检查所有子表,如果您总共有 500,000 个子行,这当然可能需要一些时间...

    第二个想法:触发器触发?

    • 在此表或子表上或尝试通过代码等进行级联
    • 上帝保佑,DELETED 中每一行的光标...

    【讨论】:

      【解决方案4】:

      尝试更新统计信息。 5000 行没什么大不了的。如果您定期执行此操作,则还应安排对该表的维护(即重新构建索引、更新统计信息等)

      【讨论】:

        【解决方案5】:

        正如其他人所观察到的,可能的嫌疑人是外键。

        首先,因为如果依赖表又被其他表引用,那么 ON DELETE CASCADE 可以聚集势头,而其他表又可能被引用,依此类推。

        其次,因为其他用户可能会锁定需要删除的行。这是超时的最可能原因。这将如何工作取决于您的数据库的风格和版本。例如,旧版本的 Oracle (

        【讨论】:

          猜你喜欢
          • 2010-10-09
          • 2015-04-05
          • 2020-09-26
          • 2020-09-27
          • 2017-03-30
          • 2011-09-18
          • 2016-03-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多