[SQL SERVER][Denali] Columnstore Index 執行模式 (Row VS Batch)

[SQL SERVER][Denali] Columnstore Index 執行模式 (Row VS Batch)

很久以前我大概有介紹過Columnstore Index為data warehouse查詢效能上所帶來的改善,

我們知道 SQL2012 多了 Batch 新的執行模式,但當資料量太少時,

執行計畫會選用 Row 執行模式,但查詢時間較短使用 Batch Mode難道就沒幫助嗎?

下面我將實際測試 Columnstore Index 使用 Row 和 Batch 執行模式查詢資料量較少的效能差異。

 

我將使用 MSDN 上的範例

image

SELECT c.CommuteDistance, 
       d.CalendarYear, 
       SUM(f.SalesAmount) TotalSalesByCommuteDistance 
FROM dbo.FactInternetSales as f 
INNER JOIN dbo.DimCustomer as c ON 
           f.CustomerKey = c.CustomerKey 
INNER JOIN dbo.DimDate d ON 
           d.DateKey = f.OrderDateKey 
GROUP BY c.CommuteDistance, 
         d.CalendarYear 

 

一般非叢集索引

時間和I/O統計

image

 

執行計畫

image

實際批次數目=0。

 

建立Columnstore Index

create nonclustered columnstore index CSI_FactInternetSales on dbo.FactInternetSales
( 
[OrderDateKey], 
[CustomerKey], 
[SalesAmount] 
)

 

再次執行相同查詢

Columnstore Index and Row process

時間和I/O統計

image

可以看到I/O明顯降低(比使用一般非叢集索引來的好)。

 

執行計畫

image

實際批次數目=0。

 

Columnstore Index and Batch process

由於資料量不夠大(查詢不夠耗時),所以無法使用 Batch 處理,

但我們還是有辦法可以模擬大資料表,你有想到什麼方法嗎?(千萬不要告訴我...匯入百萬筆真實資料...Orz),

由於執行計畫資估計的料列數目是透過統計值所取得,所以我們只要在資料表上的統計值動點手腳,

即可讓執行計畫信以為真資料表含有大量資料。

 

--更新資料表相關統計值=990000
update statistics FactInternetSales with rowcount=990000,pagecount=990000 
--刪除執行計畫
dbcc freeproccache
--再次執行查詢
SELECT c.CommuteDistance, 
       d.CalendarYear, 
       SUM(f.SalesAmount) TotalSalesByCommuteDistance 
FROM dbo.FactInternetSales as f 
INNER JOIN dbo.DimCustomer as c ON 
           f.CustomerKey = c.CustomerKey 
INNER JOIN dbo.DimDate d ON 
           d.DateKey = f.OrderDateKey 
GROUP BY c.CommuteDistance, 
         d.CalendarYear 

 

時間和I/O統計

image

Batch Mode下,整個邏輯讀取=0。

 

執行計畫

image

實際批次數目=129,估計的資料列數目=990000(前面所動的手腳)。

 

結論:

1.Columnstore Index and Row process 可以享受到資料壓縮和讀取較少行的優點。

2.Columnstore Index and Batch process 可以享受到額外效能的改善和更少的I/O讀取。

 

 

參考

資料行存放區索引

Row and batch execution modes and columnstore indexes