O que exatamente pode ser executado no modo de lote a partir do SQL Server 2014?
O SQL Server 2014 adiciona o seguinte à lista original de operadores de modo em lote:
- Hash Associação externa (incluindo associação completa)
- Hash Semi Join
- Hash Anti Semi Join
- União Tudo (apenas concatenação)
- Agregado hash escalar (sem agrupar por)
- Criação de tabela de hash em lote removida
Parece que os dados podem fazer a transição para o modo em lote, mesmo que não sejam originários de um índice columnstore.
O SQL Server 2012 foi muito limitado no uso de operadores em lote. Os planos do modo de lote tinham uma forma fixa, baseavam-se nas heurísticas e não podiam reiniciar o modo de lote após a transição para o processamento no modo de linha.
O SQL Server 2014 adiciona o modo de execução (lote ou linha) à estrutura de propriedades gerais do otimizador de consulta, o que significa que ele pode considerar a transição para dentro e fora do modo de lote em qualquer ponto do plano. As transições são implementadas pelos adaptadores do modo de execução invisível no plano. Esses adaptadores têm um custo associado a eles para limitar o número de transições introduzidas durante a otimização. Esse novo modelo flexível é conhecido como Execução de modo misto.
Os adaptadores do modo de execução podem ser vistos na saída do otimizador (embora infelizmente não esteja nos planos de execução visíveis ao usuário) com o TF 8607 não documentado. Por exemplo, o seguinte foi capturado para uma consulta que conta linhas em um armazenamento de linhas:
O uso de um índice columnstore é um requisito formal necessário para fazer o SQL Server considerar o modo em lote?
É hoje sim. Um possível motivo para essa restrição é que ela restringe naturalmente o processamento em modo de lote ao Enterprise Edition.
Talvez possamos adicionar uma tabela fictícia de linha zero com um índice columnstore para induzir o modo em lote?
Sim, isso funciona. Também vi pessoas cruzando-se com um índice columnstore clusterizado de linha única por esse motivo. A sugestão que você fez nos comentários à esquerda de ingressar em uma tabela fictícia columnstore em false é excelente.
-- 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;
Planeje com junção externa esquerda simulada:
A documentação é fina
Verdade.
As melhores fontes oficiais de informações são os índices de armazenamento de colunas descritos e o ajuste de desempenho do armazenamento de colunas do SQL Server .
O MVP do SQL Server, Niko Neugebauer, tem uma série fantástica no columnstore em geral aqui .
Existem alguns bons detalhes técnicos sobre as alterações de 2014 no documento da Microsoft Research, aprimoramentos nos armazenamentos de colunas do SQL Server (pdf), embora essa não seja a documentação oficial do produto.