试图理解上面查询计划中的一些事情。
当我没有分组依据时,为什么查询中会有一个流聚合。我猜这与正在合并的连接及其进行某种排序有关吗?
其次,更重要的是,为什么 13
进入流的估计总计结果为 24,595,900?这导致了 Object4 扫描聚集索引而不是嵌套循环的第二个问题。我不得不将查询拆分为两个查询而不是使用 OR,并且连接变成嵌套循环并查找 Object4。
查询计划
试图理解上面查询计划中的一些事情。
当我没有分组依据时,为什么查询中会有一个流聚合。我猜这与正在合并的连接及其进行某种排序有关吗?
其次,更重要的是,为什么 13
进入流的估计总计结果为 24,595,900?这导致了 Object4 扫描聚集索引而不是嵌套循环的第二个问题。我不得不将查询拆分为两个查询而不是使用 OR,并且连接变成嵌套循环并查找 Object4。
查询计划
回答你的第一个问题:
SQL Server 正在有效地重写您的查询。这个查询:
也可以这样写:
这就是为什么您
Object2
在查询计划中有两种不同的访问方法。该Merge Join (Concatenation)
操作实际上不是合并连接。它只是实施UNION ALL
并组合结果。您提到的流聚合按Object3.Column2
. 这既可以从中删除重复项Merge Join (Concatenation)
,也可以对数据进行排序,以便它可以在以下MERGE JOIN
对象 4 中使用。回答你的第二个问题:
它看起来像一个错误。经过一番搜索,我找到了 Paul White 的一篇文章来解释这个问题。如果您想投票或将自己添加为受影响,该错误将报告给Connect 。
简而言之,基数估计为 24595900,因为四舍五入
Object2
后 27328800(表基数 )* 0.9 = 24595900。您使用的是 SQL Server 2008,因此使用旧版 CE 计算:我建议通读整篇文章。这个问题有点难以总结,但我会尝试通过在接近尾声的地方引用部分文本来做到这一点:
像您一样拆分查询应该可以防止出现此问题。您还可以通过使用重写查询来获得一些运气
UNION
(请参阅本文中的示例 4)。