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

Dil*_*ngh 11 sql-server

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

The*_*war 19

假设您有一个如下所示的表col1作为主键

col1  col2  col3
1      2     3
4      5     6
Run Code Online (Sandbox Code Playgroud)

正常索引将如下所示存储,假设页面只能容纳一行

   row1  1   2  3--page1-- all columns reside in one page
   row2  4   5  6--page2
Run Code Online (Sandbox Code Playgroud)

所以当你想读一些像sum(col3)这样的东西时,SQLServer需要读取page1来获得3和6,这是两页的成本..

现在使用列存储索引,将存储相同的表,如下所示

page1  page2   page3
1       2       3
4       5       6
Run Code Online (Sandbox Code Playgroud)

现在,如果你想做一个col3的总和,它只需要读一页(第3页)

使用列存储索引的好处是,您可以只触摸Disk中的必要页面.Memory也可以有效使用,因为您不会存储不必要的数据


Ngu*_*Tan 6

列存储索引在这里得到很好的解释:http : //www.patrickkeisler.com/2014/04/what-is-non-clustered-columnstore-index.html

传统的 群集和非聚集索引你提到的都是rowstore指数,其中数据库存储由行索引行。该索引将分布在多个分区上,因此,即使我们仅选择一列,数据库仍必须扫描所有分区以获取数据,因此要进行大量的I / O操作。

另一方面,Columnstore索引逐列存储索引。通常,由于一列的所有数据组合起来不会那么大,因此它将一列的所有数据存储在一个分区中。现在,当我们从索引中选择1列时,数据库可以从一个分区返回数据,这减少了很多I / O。此外,列存储索引通常具有显着的压缩率,因此I / O效率更高,整个索引可以保存在内存中,这有助于使查询速度提高10到100倍。

列存储索引的性能并不总是比行存储好。列存储索引适用于诸如数据仓库和BI之类的场景,在这些场景中,数据经常被大量处理,例如用于聚合。但是,在经常搜索数据的情况下,它的性能比行存储索引差。

值得注意的一件事是,非聚集的列存储索引可锁定表以防止更改(但有一些变通方法可更改数据),而聚集的列存储索引仍允许您编辑数据而无需删除或禁用索引。

有关此主题的更多信息,请参考上面的文章,并尝试阅读MSDN文档。


Kan*_*amy 5

聚集列存储索引是 SQL Server 2014 中的一项新功能。列存储索引允许以列格式存储数据,而不是传统的基于行的存储。列存储索引(非集群)最初是在 SQL 2012 中引入的,用于解决数据仓库/报告的典型高容量要求下的高查询性能。

要点:

  1. 它将数据存储在列式数据结构中,这有助于更快地读取。以压缩格式存储数据,因此您的总 IO 成本将非常小。
  2. 列存储数据结构是相同的数据结构,其中数据和索引存储所有内容,与数据分开存储和索引分开存储等不同,
  3. 对于每天仅选择有限列的更多列表将非常有用,例如,如果有 ProductSalesFact 表,您通常会为此产品选择销售数量,或本季度的销售额等,即使它有数百个列,它只访问两个必需的列。

我的关于列存储索引的博客提供了 3 亿条记录的性能研究,列存储与行存储

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

各种版本的列存储和路径的 MSDN 链接:

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