您好我对列存储索引感到困惑,什么是列存储索引以及它与聚簇索引和非聚簇索引的区别。
答案 0 :(得分:14)
假设您有一个如下表格,其中col1
为主键
col1 col2 col3
1 2 3
4 5 6
正常索引将如下所示存储,假设页面只能容纳一行
row1 1 2 3--page1-- all columns reside in one page
row2 4 5 6--page2
所以当你想读一些像sum(col3)这样的东西时,SQLServer需要读取page1来获得3和6,这是两页的成本..
现在使用列存储索引,将存储相同的表,如下所示
page1 page2 page3
1 2 3
4 5 6
现在,如果你想做一个col3的总和,它只需阅读一页(第3页)
使用列存储索引的好处是,您可以只触摸Disk中的必要页面.Memory也可以有效使用,因为您不会存储不必要的数据
答案 1 :(得分:3)
这里对列存储索引进行了很好的解释:http://www.patrickkeisler.com/2014/04/what-is-non-clustered-columnstore-index.html
您提到的传统群集和非群集索引都是 rowstore 索引,其中数据库逐行存储索引。索引将分布在多个分区上,因此即使我们只选择一个列,数据库仍然必须扫描所有分区以获取数据,从而产生大量I / O.
另一方面,Columnstore 索引按列存储索引列。通常,这将使列的所有数据都存储在一个分区中,因为组合的一列的所有数据都不是那么大。现在,当我们从索引中选择1列时,数据库可以从一个分区返回数据,这会减少很多I / O.此外,列存储索引通常具有显着的压缩比,因此I / O更高效,整个索引可以保存在内存中,这有助于使查询速度提高10倍到100倍。
列存储索引并不总是比rowstore更好。 Columnstore索引适用于数据仓库和BI等场景,其中数据通常是大量处理的,例如聚合。但是,在数据经常在单个行中搜索的情况下,它的性能比rowstore index差。
值得注意的是,非群集列存储索引会阻止您的表被更改(但有一些解决方法可以更改数据),而群集列存储 index仍允许您编辑数据而不删除或禁用索引。
有关此主题的更多信息,请参阅上面的文章,并尝试阅读MSDN文档。
答案 2 :(得分:2)
群集列存储索引是SQL Server 2014中的一项新功能。列存储索引允许数据以列式格式存储,而不是传统的基于行的存储。最初在SQL 2012中引入了列存储索引(非群集),以满足数据仓库/报告中典型的高容量需求下的高查询性能。
主要观点:
- 它将数据存储在柱状数据结构中,有助于更快地读取数据。 以压缩格式存储数据,因此您的总IO成本将非常小。
- 列存储数据结构与存储数据和索引的数据结构相同,不同于单独存储的数据和单独存储的索引等。
- 对于每天只选择有限列的更多列表非常有用,例如,如果有ProductSalesFact表,您通常会选择此产品的销售数量,或者本季度的销售额等等虽然它有数百个列,但它只能访问两个必需的列。
醇>
我的关于columnstore index的博客,提供了使用columnstore vs rowstore
的3亿条记录的性能研究https://sqlserver101.wordpress.com/2016/01/25/why-clustered-columnstore-index-in-sql-server-2014/
各种版本的columnstore和路径的MSDN链接: