[SQL SERVER]SQL2016-Columnstore Indexes增強(4)

平行處理提高Insert效能。

SQL Server 2016針對select .. into. With(TABLOCK)完全採用平行新增(parallel insert),

這消息相信對有在執行ETL作業的DBA或開發人員算一大福音。

在SQL Server 2014資料如要新增至Columnstore index,

基本上只會使用單一執行緒來處理,大概過程就是直到row group填滿後在換下一個row group,

所以導致資料表含有Columstore Index,不論查詢計畫有多棒,資料新增往往是最慢的。

SQL2014

 

在SQL Server 2016且資料庫層級為130,使用select .. into. With(TABLOCK)預

設將使用平行處理,我們將使用每一個CPU核心來接收資料並分割Delta-Store。

現在我就來簡單測試TABLOCK對新增效能的差異

CREATE TABLE [dbo].[testDatetime_CCI](
      id INT NOT NULL,
        sdatetime DATETIME NOT NULL,
        edatetime DATETIME NOT NULL,
		sdate date not null,
        content VARCHAR(300) NOT NULL,
     INDEX PK_testDatetime_CCI CLUSTERED COLUMNSTORE 
);


insert into [testDatetime_CCI]
select top 2000000 id,sdatetime,edatetime,sdate,content
from testDatetime option (recompile)

新增二百萬筆約耗費15秒,透過執行計畫可以看到只使用一條執行緒新增。

 

查看Row Group

select *
	from sys.column_store_row_groups
	where object_schema_name(object_id) + '.' + object_name(object_id) = 'dbo.testDatetime_CCI'
	order by row_group_id asc;

使用TABLOCK新增

truncate table [testDatetime_CCI]
insert into dbo.testDatetime_CCI with(TABLOCK)
select top 2000000 id,sdatetime,edatetime,sdate,content
from testDatetime option (recompile)

使用TABLOCK快了2秒鐘,因為我VM的CPU只有2 core,

所以這裡可以看到使用兩條執行緒平行新增(CPU core數量越多,耗用時間越少)。

 

查看row group

這次可以看到只產生12個row group,且最後兩個資料平均分散(因為我們使用兩條執行緒)

,並且所有狀態都為壓縮,

我們再透過sys.dm_db_column_store_row_group_physical_stats確認最後兩個row group trim原因為BULKLOAD。

select *
	from sys.dm_db_column_store_row_group_physical_stats
	where  object_schema_name(object_id) + '.' + object_name(object_id) = 'dbo.testDatetime_CCI'
	order by generation;

BULKLOAD,表示資料載入Compressed rowgroup,會紀錄最少內容。但載入delta rowgroup(差異資料列群組)就不會最小化紀錄(Log)

 

Nonclustered Columnstore測試

CREATE TABLE [dbo].[testDatetime_NCCI](
      id INT NOT NULL,
        sdatetime DATETIME NOT NULL,
        edatetime DATETIME NOT NULL,
		sdate date not null,
        content VARCHAR(300) NOT NULL,
   INDEX IDX_testDatetime_NCCI Nonclustered Columnstore (id,sdatetime,edatetime,sdate,content)
);
insert into dbo.[testDatetime_NCCI] with(TABLOCK)
select top 2000000 id,sdatetime,edatetime,sdate,content
from testDatetime option (recompile)

可以看到可更新的Nonclustered Columnstore並無法使用TABLOCK平行新增,

二百萬筆資料整整花費38秒才完成。

 

查看row group

Note:InMemory資料表並無法支援TABLOCK

 

Enjoy SQL Server 2016

 

參考

Columnstore Indexes Data Loading

Columnstore Index: Scan and parallelism

Data Loading performance considerations with Clustered Columnstore indexes