sql-server - SQL PK删除单行很慢
问题描述
在我们的应用程序中,我们可以撤消刚刚创建的任务的创建。例如,我们将发出以下删除:
delete from task where taskid = 290313
这非常慢,最多可能需要 30 秒才能执行。
几十个表都有Task的外键,TaskId在所有表中都有索引。
查看执行计划,我可以看到许多读取索引中所有记录的索引扫描(非搜索)。
为什么它使用完整的 Index Scan 而不是 Seek ?
我使用的是 Azure SQL 数据库最新版本。
[编辑]
任务表上的索引:
此处查询计划:https ://www.brentozar.com/pastetheplan/?id=SJtzfNyp7
解决方案
我删除并重新创建了所有没有级联删除的外键。现在执行计划正在使用高效的 Index Seeks 来检查所有 FK 上的 RI。
不知道为什么启用级联删除会导致这些索引扫描...
推荐阅读
- mysql - Mysql性能问题:插入10000条记录超时,创建5000条记录仍然需要26秒
- microsoft-edge - 超越 Microsoft Edge 大声朗读速度限制
- vb.net - 阻止 DataGridView BindingSource 更新特定列的单元格值
- php - 未捕获的错误:不能使用 stdClass 类型的对象作为数组
- python - 对象没有“附加”属性?
- session - 无法在对服务器的后续请求中使用 Gorilla Sessions 持久化数据
- python - 如何在 sklearn 中为算法使用 sample_weight 参数
- node.js - 在节点 js 服务器中部署我的 Angular 应用程序的问题
- c# - 从 C# 调用 Azure powershell cmdlet
- python - 每天查找唯一的时间戳