列存储结构
列存储数据实际存储在每列一个或多个 段(常规LOB分配单位)中,并且也可以按常规方式进行分区。每个段包含大约一百万行高度压缩的值或值引用(可以使用几种压缩技术)。值引用链接到最多两个哈希字典之一中的条目。
字典固定在查询执行期间的内存中,只要执行需要实际的数据值,就会在字典中查找来自该段的数据值ID(出于性能原因,此查找会尽可能推迟)。
段中还包含一个标头记录,其中包含元数据,例如存储在段中的最小值和最大值。来自标头的信息通常可用于在执行时从处理中消除完整的分区。标头记录信息存储在通常的LOB数据根结构中,因此消除段意味着存储引擎可以跳过从物理存储完全读取LOB数据页的操作。要最大程度地消除这种可能性,可能需要进行仔细的设计,包括在建立Columnstore索引时依赖于聚集索引的顺序。
特定计划运营商
SQL Server 2012引入了一种称为批处理模式的新执行模式。在这种模式下,大约1000行的数据包在运算符之间传递,从而大大提高了处理器利用率。在每个分组内,柱状数据被表示为向量。并非所有计划操作员都支持批处理模式操作,但确实有一些示例,包括列存储索引扫描,哈希内部联接,批处理哈希表构建,位图过滤器,哈希聚合(非标量聚合),过滤器和计算标量(用于投影和表达)评估)。查询执行计划已得到增强,可以显示估计的和实际的执行模式。
反模式
在第一个版本中有很多限制,包括对允许的数据类型的限制。支持大多数常见类型;不支持的数据类型包括DECIMAL
与精度大于18位数字,(N)VARCHAR(MAX)
,UNIQUEIDENTIFIER
,CLR类型和(VAR)BINARY
。
的使用字符串类型,OUTER JOIN
,IN
,EXISTS
,NOT IN
,OR
,UNION ALL
可能会导致显著降低的性能(行模式执行),除非解决方法采用通常涉及不寻常的语法的重写,如图本节中的链接的文章。
更多信息
Remus Rusanu在这里发布了很棒的概述。