SQL Server 2014 在批处理模式下究竟能执行什么?

usr*_*usr 23 sql-server columnstore sql-server-2014 batch-mode

在查询中使用列存储索引时,SQL Server 能够使用批处理模式。关于什么可以在批处理模式下运行,什么不能运行的文档很少。请查看以下(激励性)查询计划,其中以批处理模式(绿色)执行的事情数量惊人:

在此处输入图片说明

(这是一个估计的计划,我用实际计划来验证实际执行方式确实是批处理。)

请注意,只有 T1 的构建端使用列存储索引。所有探测输入(T2 和 T3)都是行存储。他们的数据似乎过渡到批处理模式。我一直认为批处理模式仅用于通过探针端运行的数据流。

即使数据不是来自列存储索引,数据似乎也可以转换为批处理模式。这就提出了一个问题:为什么 SQL Server 不对仅行存储的查询使用批处理模式?可能对他们中的一些人有益。使用列存储索引是否是使 SQL Server 考虑批处理模式所必需的正式要求?我们可以添加一个带有列存储索引的零行虚拟表来引入批处理模式并实现性能提升吗?

从 SQL Server 2014 开始,究竟可以在批处理模式下运行什么?

Pau*_*ite 32

从 SQL Server 2014 开始,究竟可以在批处理模式下运行什么?

SQL Server 2014 将以下内容添加到批处理模式运算符的原始列表中:

  • Hash 外连接(包括全连接)
  • 哈希半连接
  • 哈希反半连接
  • 联合所有(仅串联)
  • 标量哈希聚合(无分组依据)
  • 批量哈希表构建已删除

即使数据不是来自列存储索引,数据似乎也可以转换为批处理模式。

SQL Server 2012 在使用批处理运算符方面非常有限。批处理模式计划具有固定的形状,依赖于启发式,并且一旦转换到行模式处理就无法重新启动批处理模式。

SQL Server 2014 将执行模式(批处理或行)添加到查询优化器的通用属性框架中,这意味着它可以考虑在计划中的任何点转换成和退出批处理模式。转换由计划中的不可见执行模式适配器实现。这些适配器具有与它们相关联的成本,以限制优化期间引入的转换数量。这种新的灵活模型称为混合模式执行。

执行模式适配器可以在优化器的输出中看到(虽然遗憾的是不在用户可见的执行计划中)和未记录的 TF 8607。例如,以下是针对行存储中的行计数查询捕获的:

行到批到行适配器

使用列存储索引是否是使 SQL Server 考虑批处理模式所必需的正式要求?

是今天,是的。此限制的一个可能原因是它自然将批处理模式处理限制为企业版。

我们可以添加一个带有列存储索引的零行虚拟表来引入批处理模式吗?

是的,这有效。我也看到人们因为这个原因交叉连接了一个单行聚集列存储索引。您在评论中提出的在 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;
Run Code Online (Sandbox Code Playgroud)

计划与虚拟左外连接:

带有虚拟表的批处理模式

文档很薄

真的。

最好的官方信息来源是Columnstore Indexes DescribedSQL Server Columnstore Performance Tuning

SQL Server MVP Niko Neugebauer 在这里有一个关于列存储的很棒的系列文章。

尽管这不是官方产品文档,但在 Microsoft Research 论文SQL Server 列存储的增强(pdf) 中有一些关于 2014 年更改的很好的技术细节。