SQL Server 列存储索引性能总结(2)——获取元数据信息

接上文: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和怎么看里面的数据,但是介绍比较简单,后面的文章会逐步深入。接下来我们看看关于锁的问题。

   下一篇:SQL Server 列存储索引性能总结(3)——列存储的锁

发布了192 篇原创文章 · 获赞 1268 · 访问量 250万+

猜你喜欢

转载自blog.csdn.net/DBA_Huangzj/article/details/104799876