我对列存储索引感到困惑。
什么是列存储索引,它与聚集索引和非聚集索引有何不同?
假设您有如下表col1
作为主键:
col1 (PK) |
col2 |
col3 |
1 |
2 |
3 |
4 |
5 |
6 |
普通索引将“按行”(每行)存储,因此单个给定行的所有列都驻留在单个页面上(假设一个页面只能容纳一行):
Page |
col1 |
col2 |
col3 |
page1 |
1 |
2 |
3 |
page2 |
4 |
5 |
6 |
因此,当您想跨多行读取某些内容时,例如和SUM(col3)
,SQL Server 将需要读取第 1 页和第 2 页才能交付,这是本示例中读取的两个页面的总“成本”。
使用列存储索引,相同的数据将“按列”存储,按以下方式存储:column页面代替:
Page |
row1 |
row2 |
page1 |
1 |
4 |
page2 |
2 |
5 |
page3 |
3 |
6 |
这意味着如果你想做同样的事情SUM(col3)
与之前相比,SQL Server 现在只需读取一页(第 3 页),而不是像以前那样读取两页。
列存储索引为以列为中心的查询提供了明显的好处,因为它们允许处理引擎使用更少的内存和 I/O 来减少不需要的数据读取。
因此,在频繁运行此类查询的大型表中,适当的列存储索引的性能优势可能是巨大的(根据数据,性能和数据压缩增益高达 10 倍)Microsoft SQL 文档 https://learn.microsoft.com/en-us/sql/relational-databases/indexes/columnstore-indexes-overview).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)