SQL Server 2012推出Columnstore indexes第一個版本,
主要是提高OLAP查詢效能,並改用欄位為單位方式進行儲存,
但諸多限制對OLTP環境相當不有善(建立後資料表變唯讀、只能使用drop and create模式..等),
現在SQL Server 2016讓我們看到Columnstore indexes這幾年堅持及一路走來的改善。
由於我工作環境大多為OLTP,所以早期我根本不會拿自己正式環境來建立Columnstore Indexes,
但Columnstore Indexes走過SQL2012、2014和2016,早已不是以前吳下阿蒙,
這篇先來看看TSQL方面改善
定義資料表可直接定義Clustered 和 Nonclustered Columnstore Indexes
create table Test_CCI
(
Serial int not null
,c2 varchar(10)
,index PK_Test_CCI clustered columnstore
)
insert into Test_CCI select 1,'rico'
create table Test_NCCI
(
Serial int not null
,c2 varchar(10)
,c3 nvarchar(20)
,c4 date
,index NCCIdx1 nonclustered columnstore(c2,c4)
)
insert into Test_NCCI select 1,'rico',N'全文檢索','2016-01-15'
create table Test_NCCI_Filter
(
Serial int not null
,c2 varchar(10)
,c3 nvarchar(20)
,c4 date
,index NCC_Filter_Idx1 nonclustered columnstore(c2,c4)
where serial>100
)
insert into Test_NCCI_Filter select 101,'rico',N'全文檢索','2016-01-15'
定義IN-Memory資料表可直接定義Clustered Columnstore Indexes
create table TestMemory_CCI
(
Serial int not null
,c2 varchar(10)
,c3 nvarchar(20)
,c4 date
,constraint PK_TestMemory_CCI primary key nonclustered(Serial)
--,index NCCIdx1 nonclustered columnstore(c2,c4) 目前SQL2016還不支援 nonclustered columnstore
,index CCIdx clustered columnstore
) with(memory_optimized=on,durability=schema_and_data)
insert into TestMemory_CCI select 1,'rico',N'全文檢索','2016-01-15'
Alter Index
-- This command will force all CLOSED and OPEN rowgroups into the columnstore.
alter index PK_Test_CCI ON Test_CCI
reorganize with (compress_all_row_groups = ON);
IN-Memory資料表支援Alter
--刪除columnstore index,因為Memory資料表新增欄位不能存在columnstore index
alter table TestMemory_CCI drop index CCIdx
--新增欄位
alter table TestMemory_CCI add c5 int null;
--新增非叢集索引
alter table TestMemory_CCI add index idx1(c2,c4)
Enjoy SQL Server 2016
參考
Columnstore Indexes Versioned Feature Summary
[鐵人賽][Denali 新特性探險26]Columnstore Indexes
Altering Memory-Optimized Tables
Indexes for Memory-Optimized Tables