我有一个需要很长时间的删除查询。查看执行计划,我看到删除查询中的大部分估计成本都位于数据模型的一部分中,该部分具有大量数据(例如 400k 行),这看起来不错,但我不明白一件事.
数据模型的精简视图:
table ParentObject
int parentObjectId (PK)
table Child
int childId (PK)
int parentId (FK)
<stuff>
table GrandChild
int grandChildId (PK)
int childId (FK)
<more stuff>
Run Code Online (Sandbox Code Playgroud)
其中父对象可能有 200,000 个子对象,而子对象有 2 个左右的 GrandChildren。我对调整以下性能感兴趣:
DELETE FROM ParentObject WHERE parentObjectId = %d;
Run Code Online (Sandbox Code Playgroud)
在 Grandchild 上,(childId, + 两个其他列) 以及主键索引上有一个额外的非聚集索引。在 child 上有一个额外的非聚集唯一索引(parentId,+ 两个其他列)。
我在查询计划中看到的是,在删除 Grandchild 对象时,有两个昂贵的排序操作与删除混合在一起,我不明白它们为什么存在。
我应该注意什么来帮助这个删除操作更快?需要排序吗?如果我对 id 进行非规范化并将父 ID 添加到孙子表中会有所帮助吗?我是否愚蠢地建立了索引?
performance foreign-key sql-server delete sql-server-2008-r2 performance-tuning