O que exatamente o SQL Server 2014 pode executar no modo de lote?


21

Quando um índice columnstore está sendo usado em uma consulta, o SQL Server pode usar o modo em lote. A documentação é fina sobre o que pode ser executado no modo de lote e o que não pode. Observe o seguinte plano de motivação (motivador) em que um número surpreendente de coisas é executado no modo em lote (verde):

insira a descrição da imagem aqui

(Este é um plano estimado. Utilizei o plano real para verificar se o modo de execução real é realmente um lote.)

Observe que apenas o lado da construção do T1 usa um índice columnstore. Todas as entradas do probe (T2 e T3) são armazenamentos de linha. Seus dados parecem passar para o modo em lote. Eu sempre pensei que o modo em lote estivesse sendo usado para o fluxo de dados que é executado apenas no lado do probe.

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. Isso coloca a questão: por que o SQL Server não usa o modo em lote para consultas somente de rowstore? 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 em lote? Talvez possamos adicionar uma tabela fictícia de linha zero com um índice columnstore para induzir o modo em lote e obter ganhos de desempenho?

O que exatamente pode ser executado no modo de lote a partir do SQL Server 2014?


5
Por que o SQL Server não usa o modo em lote para consultas somente de rowstore? Porque o CS suporta apenas o modo em lote a partir de agora. 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 em lote? Sim CS é um requisito. Há um item de conexão ainda ativo Implementar suporte ao modo de lote para armazenamento de linhas aberto pela Neugebauer.
Kin Shah

2
Em 2016 há um novo truque possível obter modo de lote considerado BTW sqlmag.com/sql-server/...
Martin Smith

Respostas:


30

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:

Adaptadores linha a lote para linha

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:

Modo de lote com mesa fictícia

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.