接上文:SQL Server 列存储索引性能总结(1)——环境准备及简介, 本文介绍怎么获取和解读元数据信息,以便后续演示过程能知道内幕技术,也可以方便在日常工作中的TroubleShooting。
环境准备
我们先创建一些环境,然后一边演示一边介绍,为了不受示例数据库的影响,这次在TempDB上面运行。
创建测试表加聚集列存储索引,然后循环插入240万行数据:
--use TempDB
create table dbo.CCTest(
id int not null,
name varchar(50) not null,
lastname varchar(50) not null );
GO
-- Creating Clustered Columnstore Index
create clustered columnstore index CCL_CCTest
on dbo.CCTest;
GO
-- Insert 2.4 million rows
declare @i as int;
declare @max as int;
select @max = isnull(max(id),0) from dbo.CCTest;
set @i = 1;
begin tran
while @i <= 2400000
begin
insert into dbo.CCTest
( id, name, lastname )
values
( @max + @i, 'SomeName_', 'SomeLastName_' );
set @i = @i + 1;
end;
commit;
然后检查一下元数据信息:
select * from sys.column_store_dictionaries;
select * from sys.column_store_segments;
select * from sys.column_store_row_groups;
在完成insert之后,前两个DMVs显示为空,而第三个也就是row groups显示有数据。因为这个时候创建了3个Delta Stores(每个1048576行),其中两个为CLOSED,有一个为OPEN,因为还没填满。这个时候Tuple Mover还没触发(5分钟一次),所以还没有创建片段来编码和压缩这些数据。
当你等得足够久(超过5分钟),那么前两个DMV都会有数据。
前面提到,可以通过重组表或聚集列存储索引来触发Tuple Mover或者重建整个表:
alter table dbo.CCTest rebuild;
GO
-- 重新查询
select * from sys.column_store_dictionaries;
select * from sys.column_store_segments;
select * from sys.column_store_row_groups;
针对上面的结果做个解释:
第一个结果有两行,也就是两个Dictionaries,与第二三列关联,这两列都是varchar类型,type=3代表使用string值,每个dictionaries只有1 个entry,因为我们插入的值都是相同的。
第二个结果,也就是sys.column_store_segments,拉到最后看size,可以看到第一列(column_id=1)和后面两列字符型的占用空间完全不一样,这也说明了字符型数据的压缩率远高于数值型。
第三个结果,sys.column_store_row_groups,有三个delta store,都是compressed意味着已经变成了列存储的片段。因为触发了Tuple Mover,所以第三个本来没满的也变成了压缩。
接下来再插入10万数据:
declare @i as int;
declare @max as int;
select @max = isnull(max(id),0) from dbo.CCTest;
set @i = 1;
begin tran
while @i <= 100000
begin
insert into dbo.CCTest( id, name, lastname )
values( @max + @i, 'SomeName_', 'SomeLastName_' );
set @i = @i + 1;
end;
commit;
-- 再次查询
select * from sys.column_store_row_groups;
由于没有任何已经open的Delta store,所以这个时候SQL Server新开一个Delta store来存储10万数据。接下来再跑一下这10万数据的insert脚本,你会看到没有新增的Delta Store,因为没有达到上限。
小结
本文介绍了3个DMV和怎么看里面的数据,但是介绍比较简单,后面的文章会逐步深入。接下来我们看看关于锁的问题。