列存储索引的结构是什么?


20

代号Denali为SQL Server 2012的新功能之一是Columnstore索引。

我对常规的旧行存储索引了解很多,例如b树结构,叶级页面和b树页面之间的存储差异,所包含字段的影响,优化使用它们,键顺序等。

我很难获得有关columnstore索引内部的任何良好信息。

  • 结构如何?
  • 有树吗?还有其他结构吗?
  • 数据如何组织?
  • 哪种类型的特定运算符最适合使用它?
  • 使用其他反图案时要避免使用它们?

我可以找到的很多关于它们的内容基本上与“正常”索引完全相反,即,没有键的顺序,没有包含的字段,仅是非聚集的。

任何见解都表示赞赏。


维基百科页面上有很多关于列存储数据库的技术实现的狂热爱好者。我想象索引只是一个单列及其键的列存储数据结构。也许它使用位图索引,也许是BTree。
ConcernedOfTunbridgeWells

实际上是针对多列的。我还假设与其他SS实现一样,它会与其他产品有所不同
JNK 2012年

对于MySQL,但同样适用:developer.bazaarvoice.com/why-columns-are-cool Sybase IQ还是老爸
gbn 2012年

3
@ConcernedOfTunbridgeWells-列存储索引是否使用位图索引? 不会。列存储索引使用基于Vertipaq的专有数据表示形式。它与位图索引不同,并且不使用位索引。但这与位图索引具有一些类似的好处,例如减少了在具有少量不同值的列上进行过滤所花费的时间。
马丁·史密斯

1
Microsoft开发此功能的团队成员Remus Rusanu就此发表了一篇文章:SQL Server 2012 COLUMNSTORE索引内部
Nick Chammas

Answers:


22

列存储结构

列存储数据实际存储在每列一个或多个 (常规LOB分配单位)中,并且也可以按常规方式进行分区。每个段包含大约一百万行高度压缩的值或值引用(可以使用几种压缩技术)。值引用链接到最多两个哈希字典之一中的条目。

字典固定在查询执行期间的内存中,只要执行需要实际的数据值,就会在字典中查找来自该段的数据值ID(出于性能原因,此查找会尽可能推迟)。

段中还包含一个标头记录,其中包含元数据,例如存储在段中的最小值和最大值。来自标头的信息通常可用于在执行时从处理中消除完整的分区。标头记录信息存储在通常的LOB数据根结构中,因此消除段意味着存储引擎可以跳过从物理存储完全读取LOB数据页的操作。要最大程度地消除这种可能性,可能需要进行仔细的设计,包括在建立Columnstore索引时依赖于聚集索引的顺序。

特定计划运营商

SQL Server 2012引入了一种称为批处理模式的新执行模式。在这种模式下,大约1000行的数据包在运算符之间传递,从而大大提高了处理器利用率。在每个分组内,柱状数据被表示为向量。并非所有计划操作员都支持批处理模式操作,但确实有一些示例,包括列存储索引扫描,哈希内部联接,批处理哈希表构建,位图过滤器,哈希聚合(非标量聚合),过滤器和计算标量(用于投影和表达)评估)。查询执行计划已得到增强,可以显示估计的和实际的执行模式。

反模式

在第一个版本中有很多限制,包括对允许的数据类型的限制。支持大多数常见类型;不支持的数据类型包括DECIMAL与精度大于18位数字,(N)VARCHAR(MAX)UNIQUEIDENTIFIER,CLR类型和(VAR)BINARY

的使用字符串类型OUTER JOININEXISTSNOT INORUNION ALL可能会导致显著降低的性能(行模式执行),除非解决方法采用通常涉及不寻常的语法的重写,如图本节中的链接的文章。

更多信息

Remus Rusanu在这里发布了很棒的概述。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.