Por que a operação TOP no plano de execução do SQL

9

Depois de pesquisar um pouco, decidi postar essa pergunta por falta de resposta e pedir desculpas se houver uma pergunta / resposta semelhante por aí.

Ao executar a consulta abaixo em dois servidores SQL configurados da mesma forma, encontramos diferentes planos de execução que afetam o desempenho e precisamos de ajuda para descobrir a causa.

A pergunta:

SELECT process_id
INTO #temp
FROM revrep_revenue_fact
WHERE process_id = 284 
DROP TABLE #temp

Plano de execução do servidor A Servidor B

Plano de execução do servidor B Servidor B http://s2.postimg.org/z9fjrfv4n/server_B.png

Você notará que o servidor B tem a operação física TOP no plano de execução real e estamos tentando descobrir o porquê. Ambas as consultas usam o mesmo índice na busca de índice.

Aqui estão alguns detalhes do servidor A e do servidor B

Servidor A e B são ambos

Service Pack 1 do Windows Server 2008 R2 Standard

24GB RAM

Sistema operacional de 64 bits

Versões do SQL Server 2012 obtidas usando ( SELECT SERVERPROPERTY ('ProductVersion') )

Servidor A versão SQL 11.0.3000.0

Server B SQL versão 11.0.5058.0

O que tentamos

  1. Limpando Caches de Procedimentos
  2. Reconstruindo índices
  3. Atualizando estatísticas
  4. SET ROWCOUNT 0 com número de linhas e ir

Por que o servidor B tem o TOP no plano de execução? Neste exemplo de consulta simples, não há problemas reais, mas em uma consulta maior o custo aumenta para o TOP e vemos um impacto no desempenho. Qualquer ajuda para depurar isso seria muito apreciada e podemos obter informações adicionais que você possa precisar para ajudar.

Arthur Yegiazaryan
fonte
O TOPoperador sugere que um diferente de zero SET ROWCOUNTfoi executado anteriormente nessa conexão. Tente novamente com após a execução SET ROWCOUNT 0;. Além disso, as versões do SQL que você postou não são o SQL 2008 R2. Execute SELECT SERVERPROPERTY('ProductVersion');nos 2 servidores para obter a versão real do SQL Server.
Dan Guzman
Atualizei a postagem original com as versões sql usando a consulta de seleção fornecida. Os servidores nos quais o sql está instalado são servidores Windows 2008 R2, enquanto os servidores sql instalados são 2012. Conforme sugerido anteriormente por outro membro, em seguida, excluído, tentamos definir ROWCOUNT como 0 sem alterar o plano de execução. Veja a pergunta atualizada
Arthur Yegiazaryan 01/11/2015
Você pode colocar um GOapós a linha do número de linhas. Você também pode postar as propriedades do operador Top?
Rob Farley
Rob, acrescentou o GO e propriedades de cima para post original
Arthur Yegiazaryan

Respostas:

12

Verifique se o nível de compatibilidade do banco de dados é o mesmo nos 2 servidores. Fiz um teste rápido em uma instância do SQL Server 2012 e vi que o operador TOP é introduzido se o nível de compatibilidade for 100 ou inferior. A menos que você tenha um motivo específico para fazer o contrário, é melhor usar o nível de compatibilidade 110 (SQL Server 2012) em uma instância do SQL Server 2012.

Dan Guzman
fonte
2

Eu acho que você tem um valor para ROWCOUNT. Faz:

SET ROWCOUNT 0

... para desligá-lo.

Rob Farley
fonte
11
SET ROWCOUNT 0 não remover a parte superior do plano de execução
Arthur Yegiazaryan
11
@ Arthur Embora essa não tenha sido a solução no seu caso, pode ser a razão do comportamento para futuros leitores. (Desculpe Rob, eu tomei a liberdade de undeleting seu post, porque isso realmente poderia ser o problema para o mesmo sintoma.)
Aaron Bertrand
Aaron, concordou e obrigado por trazê-lo de volta. Não é a solução para mim, mas poderia ser para os outros.
Arthur Yegiazaryan 02/11/2015