在查询中使用列存储索引时,SQL Server 能够使用批处理模式。关于什么可以在批处理模式下运行和什么不能运行的文档很薄。请查看以下(激励性的)查询计划,其中以批处理模式(绿色)执行数量惊人的事情:
(这是一个估计的计划,我用实际的计划来验证实际执行模式确实是批处理。)
请注意,只有 T1 的构建端使用列存储索引。所有探针输入(T2 和 T3)都是行存储。他们的数据似乎转变为批处理模式。我一直认为批处理模式仅用于通过探针端运行的数据流。
即使数据不是来自列存储索引,数据似乎也可以转换为批处理模式。这就提出了一个问题:为什么 SQL Server 也不对仅行存储查询使用批处理模式?可能对他们中的一些人有益。使用列存储索引是使 SQL Server 考虑批处理模式所必需的正式要求吗?我们是否可以添加一个带有列存储索引的零行虚拟表来引入批处理模式并实现性能提升?
从 SQL Server 2014 起,究竟什么可以在批处理模式下运行?
SQL Server 2014 将以下内容添加到原始批处理模式运算符列表中:
SQL Server 2012 对批处理运算符的使用非常有限。批处理模式计划具有固定的形状,依赖于启发式方法,一旦转换到行模式处理,就无法重新启动批处理模式。
SQL Server 2014 将执行模式(批处理或行)添加到查询优化器的通用属性框架中,这意味着它可以考虑在计划中的任何时间点转换成和退出批处理模式。转换由计划中的不可见执行模式适配器实现。这些适配器具有与之相关的成本,以限制优化期间引入的转换数量。这种新的灵活模型称为混合模式执行。
执行模式适配器可以在优化器的输出中看到(尽管遗憾的是不在用户可见的执行计划中)和未记录的 TF 8607。例如,以下是针对行存储中的行计数的查询捕获的:
就是今天,是的。此限制的一个可能原因是它自然地将批处理模式限制为 Enterprise Edition。
是的,这行得通。出于这个原因,我还看到人们使用单行聚集列存储索引进行交叉连接。您在评论中提出的关于在 false 上左连接到虚拟列存储表的建议非常棒。
使用虚拟左外连接进行计划:
真的。
最好的官方信息来源是Columnstore Indexes Describe和SQL Server Columnstore Performance Tuning。
SQL Server MVP Niko Neugebauer 在这里有一个关于列存储的很棒的系列。
在 Microsoft Research 论文Enhancements to SQL Server Column Stores (pdf)中有一些关于 2014 年更改的很好的技术细节,尽管这不是官方产品文档。