【问题标题】:Performance issues while DELETE operationDELETE 操作时的性能问题
【发布时间】:2017-06-06 06:27:20
【问题描述】:

我有一个这样的简单删除语句:

DELETE FROM MY_TABLE WHERE ID='Something'

这只会删除该 ID 的一条记录,这需要一分钟多的时间,因为 MY_TABLE 被在另一个具有大约 4000 万条记录的表上创建的外键引用,并且 DELETE 操作会检查该 ID 是否存在大桌子。

一种方法是删除/重新创建此外键,但此 DELETE 操作由应用程序用户执行,我不能即时删除/重新创建此外键,除非它可能是非工作时间操作。

谁能帮忙?

【问题讨论】:

  • 在外键上创建非聚集索引
  • @Vikas verma,使用 where 子句为列创建索引
  • 检查此表上的任何触发器或删除子句。
  • 在 SQL Server Management Studio 上运行删除命令并检查执行计划。它将向您显示导致延迟的关系/触发器。
  • 使用 bigint 的 int 作为 ID 会更好。索引偏离路线。

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


【解决方案1】:

因此,您可以参考一个很好的 SO 问题 SQL delete performance.

除了像这样的问题的建议

可能的原因:

1) 级联删除操作

2) 触发器

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

4) 您的查询是否真的像您在 问题?如果是这样,该数字可能被认为是一个浮点数 数字而不是整数,从而导致类型转换 类似于 3)

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

重要

  1. 我们绝对应该研究触发器。如果有任何触发器,您应该尝试取消触发器。
  2. 也试试看其他大表的FK上是否有索引。
  3. 看看您是否可以将查询转换为 CASCADE 删除以从大表中删除,然后从 MY_TABLE 中删除,如下面的查询中所示

    DELETE FROM LARGE_TABLE WHERE LT.FK IN (SELECT PK FROM MY_TABLE WHERE ID='Something') GO DELETE FROM MY_TABLE WHERE ID='Something'

    另请参阅LARGE_TABLE 上第一次查询的性能计划。

  4. 您应该尝试将WHERE ID='Something' 替换为INT 键操作,例如WHERE anotherID=34。基本上不是在 WHERE 中使用字符串,而是尝试使用整数进行删除。很难相信 varchar 中的 ID 列。您应该在 MY_Table 中有一个 Primary KEY 聚集索引列,并在 WHERE 子句中使用此键。

  5. 提高性能的另一种方法是删除表之间的 FK 约束。您始终可以定期从LARGE_TABLE 删除垃圾,然后重建索引。

  6. 另一种更简单的方法是在这些表之间引入映射表。在哪里说存在一个名为 Map_My_Table_Large_Table 的表,它保留以下列(My_Table 中的 FK 列,Large_Table 中的 FK 列)。您可以将 CASCADE 删除转移到此表。

【讨论】:

    猜你喜欢
    • 2015-04-05
    • 2010-10-27
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2019-06-21
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多