,
,
,

让我们检查下聚集索引扫描操作符,Estimated I/O Cost(估计IO花销) 的值为0.183866,Estimated CPU Cost(估计CPU花销)为0.0435069,为了比较列索引的值,我们先记住:

现在我们创建列存储索引在非聚集索引:
<div class="cnblogs_code">
COLUMNSTORE
<span style="color: #0000ff">ON
<span style="color: #ff0000">[<span style="color: #ff0000">FactFinance<span style="color: #ff0000">]<span style="color: #000000">
(
<span style="color: #ff0000">[<span style="color: #ff0000">FinanceKey
<span style="color: #ff0000">],<span style="color: #ff0000">[<span style="color: #ff0000">DateKey<span style="color: #ff0000">],<span style="color: #ff0000">[<span style="color: #ff0000">OrganizationKey<span style="color: #ff0000">],<span style="color: #ff0000">[<span style="color: #ff0000">DepartmentGroupKey<span style="color: #ff0000">]<span style="color: #000000">)
<span style="color: #0000ff">GO
<span style="color: #0000ff">SELECT <span style="color: #ff0000">[<span style="color: #ff0000">FinanceKey<span style="color: #ff0000">],<span style="color: #ff0000">[<span style="color: #ff0000">DepartmentGroupKey<span style="color: #ff0000">] <span style="color: #0000ff">FROM <span style="color: #ff0000">[<span style="color: #ff0000">FactFinance<span style="color: #ff0000">]

这个列存储索引扫描操作符如下所示:

如上所示,Estimated I/O Cost从0.183866下降到0.0112731,这是因为SQL引擎只检索需要的列,节省了IO和内存资源。Estimated CPU的时间没有变化。
IO强化与之前相比是明显的,我们也可以比较两个查询,启用I/O statistics,检查IO的hits 表现如下:
<div class="cnblogs_code">
IO
, (
, ((IX_FactFinance_FinanceKey_DateKey_OrganizationKey_DepartmentGroupKey))
正如所示,比较执行计划,使用列存储索引的要比行索引的好四倍,那么期望一下处理大数据时的10倍性能:

当比较逻辑读时你也能发现相似的结果。明显这个逻辑读也是四倍+关系。

那么我们可以根据下图概括一下传统的行索引与列存储所以的一般性区别:

列存储索引的创建
也能够使用SSMS创建索引: Indexes -> New Index ->Non-Clustered Columnstore Index 如下:

与非聚集索引创建类似,选择列,然后这些列没有排序也不能使用Include选项:

下图中我在SQL Server2014 企业版中,创建聚集索引:

需要注意的是如果在表上已经有其他索引,尝试创建聚集列存储索引就会出现错误,正如我们之前说的,同一个表中不能或者其他索引:

不用选择列,所有数据都包含在内了:

几个好的应用场景:
如果你有大型的事实表并且存在查询问题的,或者SSAS存在其他性能问题的,列存储是一个不错的方案。一下两种情况是经过测试的比较好的应用场景:
- 对于高频率响应的报表/仪表板,尤其分析当性能表现不佳的时候,会有很不错的性能。
- 对于ETL的过程来讲,源数据的列存储索引将会极大提高性能,如果数据足够大甚至可以考虑临时创建列存储索引。然后执行ETL。
?
总结:
列存储索引是一个使用SQL Server性能优化的方案,通过减少IO消耗,尤其对数据仓库和BI查询都是由明显性能提升。它通过排序数据作为列存储,然后压缩,并使用批处理来处理数据。当然,必须要确保使用列存储索引的使用带来了好处,而不会引起其他性能问题才能使用。比如需要注意使用的硬件环境和数据,如果没有join、过滤、或者聚合导出巨大的数据量没有足够的内存则将被暂时放入硬盘进行switch off,从而引起查询性能下降。尽量在使用之前在测试环境中测试是否适合使用,同时还要关注其他环节是否受影响。
补充,在2016中增加的几个我认为不错新的feature:
基于聚集列存储索引的 B 树索引;
基于内存优化表的列存储索引;
CREATE TABLE 和 ALTER TABLE 中的列存储索引的压缩延迟选项;
单线程查询的批处理执行。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!