sql-server - 什么是列存储索引以及与聚集索引和非聚集索引有何不同?

标签 sql-server indexing columnstore

我对列存储索引感到困惑。

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

最佳答案

假设您有一个如下表,其中包含 col1作为主键:

<表类=“s-表”> <标题> col1(PK) col2 col3 <正文> 1 2 3 4 5 6

普通索引将“按行”(每行)存储,因此单个给定行的所有列都驻留在单个页面上(假设一个页面只能容纳一行):

<表类=“s-表”> <标题> 页 col1 col2 col3 <正文> 第1页 1 2 3 第2页 4 5 6

因此,当您想要跨多行读取某些内容时,例如与 SUM(col3) ,SQL Server 需要读取第 1 页和第 2 页才能交付,这是本示例中读取的两个页面的总“成本”。

使用列存储索引,相同的数据将“按列”存储在每页面中:

<表类=“s-表”> <标题> 页 第 1 行 第2行 <正文> 第1页 1 4 第2页 2 5 第3页 3 6

这意味着如果您想做同样的事情SUM(col3)与之前相比,SQL Server 现在只需读取一页(第 3 页),而不是像以前那样读取两页。

列存储索引为以列为中心的查询提供了明显的优势,因为它们允许处理引擎使用更少的内存和 I/O 来减少不需要的数据读取。

因此,在频繁运行此类查询的大型表中,适当的列存储索引的性能优势可能是巨大的(根据 the Microsoft SQL docs 高达 10 倍的性能和数据压缩增益)。

关于sql-server - 什么是列存储索引以及与聚集索引和非聚集索引有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39828638/

相关文章:

sql-server - 如何结合索引和列存储索引?

python - AppVeyor 上 Python 和 SQL Server 的多种组合

sql-server - 当 WHERE 子句包含参数化值时,为什么 SQL Server 使用索引扫描而不是索引查找

sql-server - SQL查询快速选择百万条记录

php - MySQL:有索引和小文件排序更好还是没有索引和文件排序更好?

mysql - 主键列上是否有必要有一个 PRIMARY 索引 AND 列索引?

sql-server - Azure SQL,聚集列存储索引, "TOP"性能

mysql - MariaDB/Columnstore 引擎内存阻塞

php - MSSQL_CONNECT 什么都不返回 - 没有错误但也没有响应

c# - EF6 : ObjectContext. ExecuteStoreQuery 返回空列表