繁体   English   中英

了解 SQL Server 执行计划

[英]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

计划如下:

在此处输入图片说明

我有几个关于计划的问题:

  1. 为什么它在聚合之前进行排序?
  2. 两个 Stream Aggregate 操作的用途是什么? 我可以理解在加入后做一个,但为什么是两个?
  3. 最后,这两个“计算标量”是干什么用的? 当我将鼠标悬停在它们上方时,我以为它会告诉我一些类似于“这是CASE语句”的内容,但它们非常不透明。 我怎么知道“计算标量”在做什么?
  1. 为什么它在聚合之前进行排序?

流聚合要求输入按列group by进行排序。 这样,它会一起接收一个组的所有行,并可以在它看到它已完成处理所有行时发出该组的聚合总数(并重置下一组的聚合)。

  1. 两个 Stream Aggregate 操作的用途是什么? 我可以理解在加入后做一个,但为什么是两个?

SQL Server 可以做的一种优化是在联接之前进行部分聚合以减少进入联接的行数,然后在联接之后计算最终总数。 如果factdivision = 'west'有三行,它可以将其折叠为1行并传递值3 然后,它只是需要做一个查找在所述内连接表,而不是3,可再总结连接结果得到最终的总(即,如果division具有2点匹配的行。的SUM336

在 SSMS 中,选择运算符并查看“属性”窗口 ( F4 ) 以查看两个流聚合的“定义值”。

连接右边的一个有表达式

[partialagg1008] = Scalar Operator(Count(*))

加入后的那个有

[globalagg1009] = Scalar Operator(SUM([partialagg1008]))
  1. 最后,这两个“计算标量”是干什么用的? 当我将鼠标悬停在它们上方时,我以为它会告诉我一些类似于“这是CASE语句”的内容,但它们非常不透明。 我怎么知道“计算标量”在做什么?

您还需要查看这些定义的值。

其中之一具有表达式[Expr1006] = Scalar Operator(CONVERT_IMPLICIT(int,[globalagg1009],0))并将COUNT聚合的结果转换回int 内部COUNTCOUNT_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM