Quando um índice columnstore está sendo usado em uma consulta, o SQL Server pode usar o modo de lote. A documentação é escassa sobre o que pode ser executado em modo de lote e o que não pode. Observe o seguinte plano de consulta (motivador), onde um número surpreendente de coisas é executado em modo de lote (verde):
(Este é um plano estimado. Usei o plano real para verificar se o modo de execução real é realmente em lote.)
Observe que apenas o lado da construção de T1 usa um índice columnstore. Todas as entradas de teste (T2 e T3) são rowstores. Seus dados parecem fazer a transição para o modo de lote. Sempre pensei que o modo de lote está sendo usado para o fluxo de dados que é executado apenas no lado da sonda.
Parece que os dados podem fazer a transição para o modo de lote, mesmo que não sejam originários de um índice columnstore. Isso levanta a questão: por que o SQL Server também não usa o modo de lote para consultas somente de armazenamento de linha? Pode ser benéfico para alguns deles. O uso de um índice columnstore é um requisito formal necessário para fazer o SQL Server considerar o modo batch? Poderíamos talvez adicionar uma tabela fictícia de linha zero com um índice columnstore para induzir o modo de lote e obter ganhos de desempenho?
O que exatamente pode ser executado em modo de lote a partir do SQL Server 2014?
O SQL Server 2014 adiciona o seguinte à lista original de operadores de modo de lote:
O SQL Server 2012 era muito limitado no uso de operadores de lote. Os planos do modo de lote tinham uma forma fixa, dependiam da heurística e não podiam reiniciar o modo de lote após a transição para o processamento do modo de linha.
O SQL Server 2014 adiciona o modo de execução (lote ou linha) à estrutura de propriedade geral 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 por adaptadores de modo de execução invisíveis no plano. Esses adaptadores têm um custo associado para limitar o número de transições introduzidas durante a otimização. Este novo modelo flexível é conhecido como Mixed Mode Execution.
Os adaptadores de modo de execução podem ser vistos na saída do otimizador (embora infelizmente não em planos de execução visíveis ao usuário) com TF 8607 não documentado. Por exemplo, o seguinte foi capturado para uma consulta contando linhas em um armazenamento de linha:
É hoje, sim. Uma possível razão para essa restrição é que ela restringe naturalmente o processamento em lote para Enterprise Edition.
Sim, isso funciona. Também vi pessoas fazendo junção cruzada com um índice columnstore clusterizado de linha única exatamente por esse motivo. A sugestão que você fez nos comentários para juntar à esquerda a uma tabela columnstore fictícia em false é fantástica.
Planeje com junção externa esquerda fictícia:
Verdadeiro.
As melhores fontes oficiais de informações são Índices Columnstore descritos e Ajuste de desempenho do SQL Server Columnstore .
SQL Server MVP Niko Neugebauer tem uma série fantástica sobre columnstore em geral aqui .
Há alguns bons detalhes técnicos sobre as alterações de 2014 no documento da Microsoft Research, Enhancements to SQL Server Column Stores (pdf), embora esta não seja a documentação oficial do produto.