首页 > 解决方案 > SQL PK删除单行很慢

问题描述

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

delete from task where taskid = 290313

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

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

查看执行计划,我可以看到许多读取索引中所有记录的索引扫描(非搜索)。 在此处输入图像描述

为什么它使用完整的 Index Scan 而不是 Seek ?

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

[编辑]

任务表上的索引:

在此处输入图像描述

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

这是 Live Query Statistics 的结果,我们清楚地看到 Index Scan 损失的时间: 在此处输入图像描述

标签: sql-serverforeign-keyssql-deletesql-execution-plansqlperformance

解决方案


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

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


推荐阅读