什么是columnstore索引以及如何与clustered和non-clustered不同

时间:2016-10-03 09:40:38

标签: sql-server

您好我对列存储索引感到困惑,什么是列存储索引以及它与聚簇索引和非聚簇索引的区别。

3 个答案:

答案 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中引入了列存储索引(非群集),以满足数据仓库/报告中典型的高容量需求下的高查询性能。

主要观点:

  
      
  1. 它将数据存储在柱状数据结构中,有助于更快地读取数据。   以压缩格式存储数据,因此您的总IO成本将非常小。
  2.   
  3. 列存储数据结构与存储数据和索引的数据结构相同,不同于单独存储的数据和单独存储的索引等。
  4.   
  5. 对于每天只选择有限列的更多列表非常有用,例如,如果有ProductSalesFact表,您通常会选择此产品的销售数量,或者本季度的销售额等等虽然它有数百个列,但它只能访问两个必需的列。
  6.   

我的关于columnstore index的博客,提供了使用columnstore vs rowstore

的3亿条记录的性能研究

https://sqlserver101.wordpress.com/2016/01/25/why-clustered-columnstore-index-in-sql-server-2014/

各种版本的columnstore和路径的MSDN链接:

https://msdn.microsoft.com/en-us/library/dn934994.aspx