继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

SQL Server中的ColumnStore Index的尝试

30秒到达战场
关注TA
已关注
手记 286
粉丝 95
获赞 569

     费了半天劲,今天终于装好SQL Server2012了。按照MSDN中的新特性资料(Columnstore Indexes for Fast DW QP SQL Server 11)。尝试了下ColumnStore Index。ColumnStore Index按照其字面意思所示。是基于列存储的索引。这个概念如图1所示。

    https://img.mukewang.com/5af2a9e300013fa306270515.jpg

    图1.ColumnStoreIndex和基于行的Index比较

 

    ColumnStoreIndex是按照列存入页当中,而不是按照传统的以行为单位存入页。因此带来的好处可以归结如下:

  •      以往的数据按照行存储,select哪怕只有一列,也会将整个行所在的页提取出来,而使用基于列的索引,仅仅需要提取select后面的列。提高了性能。

  •      压缩更容易

  •      缓存命中率大大提高,因为以列为存储单位,缓存中可以存储更多的页(缓存常用的列,而不是整个行)

  

    微软号称自己是第一个支持“纯”列存储的主流数据库。其他数据库我不甚了解,有知道的同学可以反驳下……

 

    使用ColumnStore Index不能像使用其它非聚集索引那样没有限制,使用ColumnStoreIndex的限制如下:

    1.一个表只能有一个ColumnStore Index

    2.不能使用过滤索引

    3.索引必须是partition-aligned

    4.被索引的表变成只读表

    5.被索引的列不能是计算列

    6.不能使用Include关键字

 

    因此可以看出,中小型的OLTP环境基本和这个功能无缘。ColumnStore Index貌似适用于OLAP和读写分离用。

    下面我们来看一些使用ColumnStore Index的实例

 

建立ColumnStore Index和对ColumnStore Index所在表数据进行更改

    建立ColumnStore Index和建立普通的非聚集索引看起来基本没有区别,仅仅是多加了一个ColumnStore关键字,如图2所示。

https://img2.mukewang.com/5af2a9ed0001d98808450330.jpg

 

   如果要对有ColumnStore Index的表进行数据更改,则需要在停用ColumnStore Index后,插入数据,完成后,重建ColumnStore Index,如图3所示。

https://img4.mukewang.com/5af2a9f60001447105270135.jpg   

ColumnStore Index查询性能测试

    ColumnStore Index带来的最大好处是查询性能的增加。下面来进行测试。在刚才图1中所建的表中插入100万条从1到1000的随机数,如图4所示。

https://img4.mukewang.com/5af2aa01000132ca07090214.jpg

    然后在Data列上分别建立ColumnStore Index和普通的非聚集索引,如图5所示。

https://img3.mukewang.com/5af2aa0b0001b57906690227.jpg

    然后分别利用这两个索引做一次聚合查询,测试结果发现使用ColumnStore Index对IO的占用大大的减少了。如图6所示。

https://img3.mukewang.com/5af2aa120001e84307250420.jpg

    所对应的执行计划如图7所示。

https://img.mukewang.com/5af2aa200001fdbf03340417.jpg

    可以看出,使用ColumnStore Index对性能的提升是巨大的。

 

总结

    本文通过对ColumnStore Index做了简单的介绍后,做了简单的测试得出,使用ColumnStore Index对性能的提升是巨大的,但由于ColumnStore Index的使用受到诸多限制。目前只能在OLAP环境中使用。更多的使用场景未来再看吧。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP