SQL Server 什么是列存储索引,它与聚集索引和非聚集索引有何不同?

rsl1atfo  于 2023-02-11  发布在  其他
关注(0)|答案(3)|浏览(311)

我对列存储索引感到困惑。
什么是列存储索引,它与聚集索引和非聚集索引有何不同?

nhaq1z21

nhaq1z211#

假设您有一个如下所示的表,其中col1作为主键:
| 第1列(PK)|列2|第3栏|
| - ------|- ------|- ------|
| 1个|第二章|三个|
| 四个|五个|六个|
普通索引将按“行”(每行)存储,因此单个给定行的所有列都驻留在单个页上(假设一个页只能容纳一行):
| 页次|列1|列2|第3栏|
| - ------|- ------|- ------|- ------|
| 第1页|1个|第二章|三个|
| 第二页|四个|五个|六个|
因此,当您希望读取多行内容时(例如,使用SUM(col3)),SQL Server需要同时读取第1页和第2页才能交付,在本例中,这是读取两页的总“成本”。
使用列存储索引,相同的数据将按“列方式”存储,而不是按-* 列 * 页存储:
| 页次|行1|行2|
| - ------|- ------|- ------|
| 第1页|1个|四个|
| 第二页|第二章|五个|
| 第3页|三个|六个|
这意味着,如果要执行与以前相同的SUM(col3),SQL Server现在只需读取一页(第3页),而不是以前的两页。
列存储索引为以列为中心的查询提供了一个明显的好处,因为它们允许处理引擎使用较少的内存和I/O读取较少的不需要的数据。
因此,在频繁运行此类查询的大型表中,适当的列存储索引可以带来巨大的性能优势(根据the Microsoft SQL docs,性能和数据压缩增益最高可达10倍)。

63lcw9qa

63lcw9qa2#

列存储索引在这里有很好的解释:http://www.patrickkeisler.com/2014/04/what-is-non-clustered-columnstore-index.html
您提到的传统的聚集索引和非聚集索引都是rowstoreindex,数据库是逐行存储索引的,索引会分布在多个分区上,所以即使我们只选择一列,数据库也要扫描所有分区才能得到数据,这样会产生大量的I/O。
另一方面,Columnstoreindex逐列存储索引。通常情况下,这会将一列的所有数据存储在一个分区中,因为一列的所有数据加起来并不那么大。现在,当我们从索引中选择一列时,数据库可以从一个分区返回数据,这减少了大量的I/O。此外,列存储索引通常具有显著的压缩比,因此I/O效率更高,并且整个索引可以保存在内存中,这有助于使查询速度提高10倍到100倍。
列存储索引的性能并不总是优于行存储。列存储索引适用于数据仓库和BI等方案,在这些方案中,数据通常是批量处理的,例如用于聚合。但是,在数据通常是在单个行中搜索的方案中,列存储索引的性能不如行存储索引。
值得注意的一点是,non-clustered columnstoreindex会锁定表,防止其被更改(但是有一些变通方案可以更改数据),而clustered columnstoreindex仍然允许您编辑数据,而无需删除或禁用索引。
有关此主题的更多信息,请参考上面的文章,并尝试阅读MSDN文档。

nfg76nw0

nfg76nw03#

聚集列存储索引是SQL Server 2014中的一项新功能。列存储索引允许以列格式存储数据,而不是传统的基于行的存储。列存储索引(非聚集)最初是在SQL 2012中引入的,目的是在数据仓库存储/报告的典型高容量要求下实现高查询性能。
要点:
1.它以柱状数据结构存储数据,有助于更快地读取数据。以压缩格式存储数据,因此总IO成本将非常低。
1.列存储数据结构是相同的数据结构,其中数据和索引存储所有内容,不同于单独存储的数据和单独存储的索引等,
1.这将是非常有用的更多列表,你只选择有限的列每天,例如,如果有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

相关问题