笔记252 SQLSERVER2012 列存储索引
笔记252 SQLSERVER2012 列存储索引
1 SQLSERVER2012 列存储索引 2 与传统索引采用不同的存储列方式,它有效地压缩了索引中的数据。在常规索引中,所有每行的索引数据都被一起保持在一页中,每列数据在一个索引中是跨所有页保留的。而在列存储索引中,每列数据被保存在一起,这样每个数据也都只包含来自单个列的数据。 3 此外,每列的索引数据都进行了压缩,因为许多列都可能包含非常重复的数据值,所以压缩率非常高。这种架构降低了索引中的页数量,如果你只选择几列,它还能降低需要扫描的页数量。 4 利用相同的规则,你可以创建常规索引,其中包含你需要的列。这里有几点要注意,创建列存储索引比创建常规索引需要的时间要长很多,将来可能得到改进。另外,一旦你在表中增加了一个列,该表就变成只读了,不能插入,更新或者删除。如果你需要插入新行或者修改现有行,你可以禁用该索引,然后做数据修改,然后再重建列存储索引。由于存在这一限制,这一功能到目前为止更适用于数据仓库这类包含静态数据的表,这种表中只是定期刷新数据,这是可以接受的。然而,你可以利用分区来避免重建索引。例如,你可以创建按日,按周或者按月分区,把数据加载到新表,重建所有索引,然后把表切换到分区表。 5 为什么列存储索引提供了更快的查询呢?有三个原因。第一个原因:因为索引中的列数据被压缩了,它占用的空间更小,因此SQL Server只需扫描更少的页。 6 第二个原因,因为只需要扫描更少的页,SQL Server就可以把它们保留在内存中,大大地提高了数据停留在内存缓冲区的可能性。因此,在那些内存大的系统中,你会看到更大的性能差异,尤其是当索引被扫描多次并且相应的行存储索引不能装入内存时更明显。 7 第三,SQL Server只需要提取查询中用到的列的索引页,而常规索引需要提取全部索引页,包括查询中用不到的那部分。因此,你又一次得到了益处,更少的页需要处理,就会更快得到结果,同样SQL Server也更可能把列缓存保持在内存缓存区中。
列存储索引好处是 它是索引级别的,所以为了前期的灰度测试,列存储索引可以先上线到二级索引
CREATE COLUMNSTORE INDEX idx_ci ON FactOnlineSales_Temp(DateKey) GO
后面稳定运行之后,可以把聚集索引也改为列存储索引,也就是在 表级别 上更改为列存储
CREATE CLUSTERED COLUMNSTORE INDEX idx_ci ON FactOnlineSales_Temp WITH (DROP_EXISTING = ON) GO