[英]Understanding a SQL Server execution plan
我有以下查询,用于查看 SQL Server 执行计划。
SELECT TOP 1000
fact.division,
case when fact.division='east' then 'XXX' else 'YYY' end div,
count(1)
FROM
division join fact on (division.division=fact.division)
where
fact.division!='east'
group by
fact.division
计划如下:
我有几个关于计划的问题:
CASE
语句”的内容,但它们非常不透明。 我怎么知道“计算标量”在做什么? 流聚合要求输入按列group by
进行排序。 这样,它会一起接收一个组的所有行,并可以在它看到它已完成处理所有行时发出该组的聚合总数(并重置下一组的聚合)。
SQL Server 可以做的一种优化是在联接之前进行部分聚合以减少进入联接的行数,然后在联接之后计算最终总数。 如果fact
对division = 'west'
有三行,它可以将其折叠为1
行并传递值3
。 然后,它只是需要做一个查找在所述内连接表,而不是3,可再总结连接结果得到最终的总(即,如果division
具有2点匹配的行。的SUM
的3
和3
是6
)
在 SSMS 中,选择运算符并查看“属性”窗口 ( F4 ) 以查看两个流聚合的“定义值”。
连接右边的一个有表达式
[partialagg1008] = Scalar Operator(Count(*))
加入后的那个有
[globalagg1009] = Scalar Operator(SUM([partialagg1008]))
CASE
语句”的内容,但它们非常不透明。 我怎么知道“计算标量”在做什么?您还需要查看这些定义的值。
其中之一具有表达式[Expr1006] = Scalar Operator(CONVERT_IMPLICIT(int,[globalagg1009],0))
并将COUNT
聚合的结果转换回int
。 内部COUNT
和COUNT_BIG
使用返回bigint
的相同设备 - 对于COUNT
这需要强制转换以获得最终广告数据类型。
另一个是计算你的CASE
表达式的结果并且有表达式[Expr1007] = Scalar Operator(CASE WHEN [avails].[dbo].[fact].[Division]=N'east' THEN 'XXX' ELSE 'YYY' END)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.