您好我对列存储索引感到困惑,什么是列存储索引以及它与聚簇索引和非聚簇索引的区别.
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也可以有效使用,因为您不会存储不必要的数据
列存储索引在这里得到很好的解释: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文档。
聚集列存储索引是 SQL Server 2014 中的一项新功能。列存储索引允许以列格式存储数据,而不是传统的基于行的存储。列存储索引(非集群)最初是在 SQL 2012 中引入的,用于解决数据仓库/报告的典型高容量要求下的高查询性能。
要点:
- 它将数据存储在列式数据结构中,这有助于更快地读取。以压缩格式存储数据,因此您的总 IO 成本将非常小。
- 列存储数据结构是相同的数据结构,其中数据和索引存储所有内容,与数据分开存储和索引分开存储等不同,
- 对于每天仅选择有限列的更多列表将非常有用,例如,如果有 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