星期三, 8月 11, 2021

[SQL] 利用視窗函數進行彙總統計

Line 社群上看見的討論,沒拿視窗函數進行資料彙總統計過,拿 AdventureWorks 來測試並筆記一下
-- 建立測試 Index 
CREATE INDEX IX_SalesOrderDetail_ProductID ON [Sales].[SalesOrderDetail] (ProductID)
INCLUDE(OrderQty)

-- 常使用的 Group By 彙總方式
SELECT 
	ProductID ,
	SUM(OrderQty) AS OrderQty
FROM [Sales].[SalesOrderDetail]
WHERE ProductID = 707
GROUP BY ProductID

-- 視窗函數彙總方式
SELECT 
	DISTINCT
	ProductID ,
	SUM(OrderQty) OVER (PARTITION BY ProductID ORDER BY ProductID)
FROM [Sales].[SalesOrderDetail]
WHERE ProductID = 707
以上兩種方式可以獲得相同結果,但在效能上會有差異

statistics io 比較

Group By視窗函數
Logical Read1010
Worktable6235
Workfile0

執行計畫成本比較

[SQL] 利用視窗函數進行彙總統計

所以兩這最大差異還是在視窗函數會使用到 Temp Table 來整理資料

視窗函數執行計畫

沒有留言:

張貼留言