小编Mik*_*keb的帖子

使用许多外键调整级联删除的性能

我有一个需要很长时间的删除查询。查看执行计划,我看到删除查询中的大部分估计成本都位于数据模型的一部分中,该部分具有大量数据(例如 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

6
推荐指数
1
解决办法
6374
查看次数