【问题标题】:SQL Delete a single row by PK is very slowSQL PK删除单行很慢
【发布时间】:2019-04-09 23:38:08
【问题描述】:

在我们的应用程序中,我们可以撤消刚刚创建的任务的创建。 例如,我们将发出以下删除:

delete from task where taskid = 290313

这非常慢,最多可能需要 30 秒才能执行。

几十个表都有Task的外键,TaskId在所有表中都有索引。

查看执行计划,我可以看到许多读取索引中所有记录的索引扫描(非查找)。

为什么它使用完整的索引扫描而不是 Seek ?

我使用的是 Azure SQL 数据库最新版本。

[编辑]

任务表上的索引:

此处查询计划:https://www.brentozar.com/pastetheplan/?id=SJtzfNyp7

这是 Live Query Statistics 的结果,我们清楚地看到了 Index Scan 损失的时间:

【问题讨论】:

  • 你能列出那个表的索引吗?它使用的是 NC 扫描,而不是您在 PK 上默认使用的 Clustered Seek。但是,PK 不一定是聚集索引
  • 您的意思是图中显示的 Task 表或 TaskTransitionLog 表?我可以提供完整的执行计划 xml,但我不知道如何在此处附加它...
  • 您可以发布here,然后提供链接。但您也可以为该表提供create index 语句吗?
  • 哪个表? :-)
  • 你要删除的那个:task

标签: sql-server foreign-keys sql-delete sql-execution-plan sqlperformance


【解决方案1】:

我删除并重新创建了所有没有级联删除的外键。 现在执行计划正在使用高效的 Index Seeks 来检查所有 FK 上的 RI。

不知道为什么启用级联删除会导致这些索引扫描...

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    相关资源
    最近更新 更多