簡體   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