列存储的基本思想是列的值连续存储在磁盘上。然后该列上的聚合可以有效地从磁盘中提取该列,并且只提取该列,从而减少必须读取的磁盘块的数量。此外,由于一个块中的所有数据值都来自同一域,因此对该块的压缩可能非常有效,从而进一步减少了所需的块数量。压缩比一般的 ZIP 要好得多——可以使用字典、游程和增量编码。
由于各种原因,最好在压缩和存储行之前将它们分成大组。SQL Server 将这些组称为“行组”,它们由“列段”组成。每个行组包含超过一百万行。当构建段时,服务器会为该列提取一些元数据,例如最小值、最大值和(可能)总和。此元数据有时称为区域图。在运行时,这些区域映射可以与查询谓词进行比较,如果谓词不在段的最小值和最大值之间,则处理可以完全避免从磁盘读取这些块。这称为段消除,类似于分区消除。此外,一些查询可以直接从区域图中回答,例如“从表中选择最小(列)”
我要注意的是,B-Tree 并不是唯一用于索引行存储的结构,它只是对使用 SQL Server 的数据库开发人员可用的唯一结构。
我们通常认为索引是一种快速查找对给定信息的所有引用的方法。在给定主题的教科书中,我们可以找到所有提到该主题的页面。在给定列值的数据库中,我们可以找到具有该值的所有行。
从这个意义上说,将列存储称为“索引”有点用词不当。它并非旨在为特定列值的行提供快速查找。相反,它旨在快速提供大型数据集的聚合结果。因此,它本身就是一种数据格式。列式数据存储,有时称为分解存储模型 (DSM),是众所周知且受人尊敬的。许多专有和开源 DBMS 都提供它。
列存储的基本思想是列的值连续存储在磁盘上。然后该列上的聚合可以有效地从磁盘中提取该列,并且只提取该列,从而减少必须读取的磁盘块的数量。此外,由于一个块中的所有数据值都来自同一域,因此对该块的压缩可能非常有效,从而进一步减少了所需的块数量。压缩比一般的 ZIP 要好得多——可以使用字典、游程和增量编码。
由于各种原因,最好在压缩和存储行之前将它们分成大组。SQL Server 将这些组称为“行组”,它们由“列段”组成。每个行组包含超过一百万行。当构建段时,服务器会为该列提取一些元数据,例如最小值、最大值和(可能)总和。此元数据有时称为区域图。在运行时,这些区域映射可以与查询谓词进行比较,如果谓词不在段的最小值和最大值之间,则处理可以完全避免从磁盘读取这些块。这称为段消除,类似于分区消除。此外,一些查询可以直接从区域图中回答,例如“从表中选择最小(列)”
我要注意的是,B-Tree 并不是唯一用于索引行存储的结构,它只是对使用 SQL Server 的数据库开发人员可用的唯一结构。