(这是一个估计的计划.我使用实际计划来验证实际执行模式确实是批处理.)
请注意,只有T1的构建端使用列存储索引.所有探头输入(T2和T3)都是行存储.他们的数据似乎转变为批处理模式.我一直认为批处理模式仅用于通过探测端运行的数据流.
似乎数据可以转换为批处理模式,即使它不是源自列存储索引.这提出了一个问题:为什么sql Server也不使用批处理模式进行仅限行存查询?对他们中的一些人可能有益.使用列存储索引是使sql Server考虑批处理模式所必需的正式要求吗?我们可以添加一个带有列存储索引的零行虚拟表来引导批处理模式并实现性能提升吗?
从sql Server 2014开始,在批处理模式下究竟能运行什么?
解决方法
What exactly can run in batch mode as of sql Server 2014?
sql Server 2014将以下内容添加到批处理模式运算符的原始列表中:
>哈希外连接(包括完全连接)
> Hash Semi加入
> Hash Anti Semi Join
>全联盟(仅限连接)
>标量散列聚合(没有分组)
>删除批处理哈希表构建
It seems that data can transition into batch mode even if it does not originate from a columnstore index.
sql Server 2012在使用批处理运算符方面非常有限.批处理模式计划具有固定的形状,依赖于启发式方法,并且一旦转换为行模式处理,就无法重新启动批处理模式.
sql Server 2014将执行模式(批处理或行)添加到查询优化器的常规属性框架,这意味着它可以考虑在计划中的任何位置转换为批处理模式.转换由计划中的不可见执行模式适配器实现.这些适配器具有与它们相关联的成本,以限制在优化期间引入的转换的数量.这种新的灵活模型称为混合模式执行.
执行模式适配器可以在优化器的输出中看到(虽然很遗憾不在用户可见的执行计划中),带有未记录的TF 8607.例如,对于计算行存储中的行的查询捕获了以下内容:
Is using a columnstore index a formal requirement that is necessary to make sql Server consider batch mode?
今天是的,是的.这种限制的一个可能原因是它自然地将批处理模式处理限制为Enterprise Edition.
Could we maybe add a zero row dummy table with a columnstore index to induce batch mode?
是的,这很有效.出于这个原因,我还看到人们使用单行聚簇列存储索引进行交叉连接.您在评论中提出的建议是加入虚假列存储表的假是非常好的.
-- Demo the technique (no performance advantage in this case) -- -- Row mode everywhere SELECT COUNT_BIG(*) FROM dbo.FactOnlineSales AS FOS; GO -- Dummy columnstore table CREATE TABLE dbo.Dummy (c1 int NULL); CREATE CLUSTERED COLUMNSTORE INDEX c ON dbo.Dummy; GO -- Batch mode for the partial aggregate SELECT COUNT_BIG(*) FROM dbo.FactOnlineSales AS FOS LEFT OUTER JOIN dbo.Dummy AS D ON 0 = 1;
使用虚拟左外连接计划:
Documentation is thin
真正.
最好的官方信息来源是Columnstore Indexes Described和SQL Server Columnstore Performance Tuning.
sql Server MVP Niko Neugebauer在here一般的列存储上有一个非常棒的系列.
虽然这不是官方产品文档,但有关Microsoft研究论文Enhancements to SQL Server Column Stores(pdf)中2014年更改的一些很好的技术细节.