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