[鐵人賽][Denali 新特性探險26]Columnstore Indexes

[鐵人賽][Denali 新特性探險26]Columnstore Indexes

概述

Denali 新增了一個新索引類型名為資料行存放區索引(ColumnStore Index),

主要是提高data warehouse(OLAP)查詢效能,ColumnStore Index不像以往採用紀錄為單位(each row)儲存體方法(row store),

而是改以欄位為單位(each column)儲存體方法(Column Store)。

Column store儲存體方法會提高緩衝命中率(data buffer可以存放更多詞條)並減少I/O(僅讀取所需欄位、

且資料連續故可以減少發生跨page讀取),

同時也具有較佳的平行運算能力,兩者儲存方式差異如下圖。

 

image

擷取Columnstore Indexes for Fast DW QP SQL Server 11

 

注意事項

1. 一個資料表只能有一個ColumnStore。

2. 只能在資料表(B-tree or heap)上建立。

3. 無法使用過濾條件。

4. 索引必須partition-aligned。

5. 資料表將變成唯讀(only select)。

6. 索引欄位不能含有計算的資料行。

7. 建立columnstore index不能使用include關鍵字。

Note:以目前相關限制來看,比較不太適和在OLTP環境中使

 

建立ColumnStore Index

--建立資料表
create table mycolumnstore
(
c1 int identity(1,1),
c2 varchar(30),
c3 date
)

	
--建立clustered index
create clustered index cix_c1
on mycolumnstore(c1)

	
--建立nonclustered columnstore index
create nonclustered columnstore index nix_cs
on mycolumnstore(c2,c3) 

 

 

--新增資料

Insert into mycolumnstore select 'rico',GETDATE()

image

前面我有提到,建立columnstore會將資料表變成唯讀,如要新增資料請依下面步驟執行。

 

資料變更步驟(注意:操作大資料表相當耗費系統資源)

1. 停用columnstore index

2. 重建columnstore index

select * from mycolumnstore
--停用columnstore index
alter index nix_cs on mycolumnstore disable
--新增資料
insert into mycolumnstore 
select 'rico',GETDATE() 
go 1000
--重建columnstore index
alter index nix_cs on mycolumnstore rebuild

 

 

image

 

查詢效能測試

資料表: QTPLG 

資料總筆數: 5008907

image

 

建立兩種類型索引

--create nonclustered index
create nonclustered index nix_BILL_NO_TYPE
on dbo.QTPLG(BILL_NO_TYPE)
--create noncluster columnstore index
create nonclustered columnstore index nixcs_BILL_NO_TYPE
on dbo.QTPLG(BILL_NO_TYPE)

 

 

執行查詢

--using normal nonclustered index
select t1.BILL_NO_TYPE,
count(1) 
from dbo.QTPLG t1 with(index(nix_BILL_NO_TYPE))
where BILL_NO_TYPE in ('H','U')
group by BILL_NO_TYPE 

image

I/O和時間統計資訊。

 

image

執行計畫(擷取部分)。

 

--using columnstore index

select t1.BILL_NO_TYPE,

	
count(1)

	
from dbo.QTPLG t1 with(index(nixcs_BILL_NO_TYPE))

	
where BILL_NO_TYPE in ('H','U')

	
group by BILL_NO_TYPE

 

 

image

image

CPU執行數目:4批次執行模式(某些操作行為會使用該模式)。

 

image

執行計畫(擷取部分)。

 

結果比較表

image

 

結論

如果你的查詢類型大部分是在處理彙總資料,那透過columnstore index絕對可以提高不少查詢效能。

透過結果比較表得知使用columnstore index經過時間改善了約3.3倍,CPU時間改善了約13.2倍。

這裡我也順便提供微軟的測試結果給大家參考一下。

image

CPU時間改善16倍、經過時間改善455倍。