自SQL Server 2014起,批处理模式下到底可以运行什么?
SQL Server 2014将以下内容添加到批处理模式运算符的原始列表中:
- 哈希外部联接(包括完全联接)
- 哈希半连接
- 哈希防半加入
- 全部合并(仅串联)
- 标量哈希聚合(无分组依据)
- 批处理哈希表构建已删除
似乎数据可以转换为批处理模式,即使它不是源自于列存储索引。
SQL Server 2012在使用批处理运算符方面非常受限制。批处理模式计划具有固定的形状,依赖于试探法,并且一旦转换到行模式处理就无法重新启动批处理模式。
SQL Server 2014将执行模式(批处理或行)添加到查询优化器的常规属性框架中,这意味着它可以在计划中的任何时候考虑转换为批处理模式和从批处理模式过渡。过渡由计划中的不可见执行模式适配器实现。这些适配器具有与之相关的成本,以限制优化期间引入的转换数量。这种新的灵活模型称为混合模式执行。
使用未记录的TF 8607,可以在优化器的输出中看到执行模式适配器(尽管遗憾的是在用户可见的执行计划中却看不到)。例如,捕获了以下查询以对行存储中的行进行计数:
使用列存储索引是否是使SQL Server考虑批处理模式所必需的正式要求?
今天是,是的。此限制的一个可能原因是,它自然将批处理模式的处理限制为Enterprise Edition。
我们可以添加一个带有列存储索引的零行虚拟表来引发批处理模式吗?
是的,这可行。正因为如此,我也看到人们与单行集群列存储索引交叉连接。您在注释中提出的关于在false上加入虚拟列存储表的建议非常棒。
-- 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;
使用虚拟左外部联接的计划:
文档很薄
真正。
最佳的官方信息来源是“ 描述的列存储索引”和“ SQL Server列存储性能调整”。
SQL Server MVP Niko Neugebauer在这里通常对列存储有一个很棒的系列。
尽管不是官方产品文档,但Microsoft Research论文《SQL Server列存储的增强(pdf)》中有关于2014年更改的一些很好的技术细节。