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
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
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.
fonte
TOP
operador sugere que um diferente de zeroSET ROWCOUNT
foi executado anteriormente nessa conexão. Tente novamente com após a execuçãoSET ROWCOUNT 0;
. Além disso, as versões do SQL que você postou não são o SQL 2008 R2. ExecuteSELECT SERVERPROPERTY('ProductVersion');
nos 2 servidores para obter a versão real do SQL Server.GO
após a linha do número de linhas. Você também pode postar as propriedades do operador Top?Respostas:
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.
fonte
Eu acho que você tem um valor para ROWCOUNT. Faz:
... para desligá-lo.
fonte