LEFT JOIN Otimização do desempenho do servidor

1

Eu tenho uma consulta que quero executar o mais rápido possível.

Aqui está:

select d.InvoiceDetailId,a.Fee,a.FeeTax
from InvoiceDetail d
LEFT JOIN InvoiceDetail a on a.AdjustDetailId = d.InvoiceDetailId

Eu coloquei um índice crescente na coluna AdjustDetailId

Em seguida, executei a consulta com "Mostrar plano de execução real" e o custo estimado da subárvore do resultado (fora do nó de seleção mais alto) foi de 2,07

Eu então pensei, talvez eu possa fazer algo para melhorar isso, então adicionei um condicional à junção à esquerda da seguinte forma:

select d.InvoiceDetailId,a.Fee,a.FeeTax
from InvoiceDetail d
LEFT JOIN InvoiceDetail a on a.AdjustDetailId is not null 
and a.AdjustDetailId = d.InvoiceDetailId

Eu corri novamente e recebi um custo de subtree de 0,98. Então eu pensei, ótimo, eu fiz isso duas vezes mais rápido. Bem, em seguida, cliquei em mostrar estatísticas do cliente e, em seguida, cliquei em executar de quatro a cinco vezes com ambas as consultas e, acredite ou não, a primeira consulta teve uma média mais rápida. Eu não entendo. A propósito, a consulta retorna 120 mil linhas.

Alguma ideia?

Talvez eu tenha resultados contaminados por causa do cache, mas não sei se é esse o caso ou como redefinir o cache.

EDITAR: Ok, eu pesquisei como limpar o cache de consulta, então adicionei o seguinte antes das consultas:

DBCC DROPCLEANBUFFERS  
DBCC FREEPROCCACHE

Em seguida, executei cada consulta cinco vezes e a primeira consulta ainda foi um pouco mais rápida (13%). 1ª Consulta: Tempo de Processamento do Cliente: 239.4 2ª Consulta: Tempo de Processamento do Cliente: 290

Então eu acho que a pergunta é, por que você acha? Poderia ser quando a tabela quadruplica de tamanho que a segunda consulta será mais rápida? Ou a junção à esquerda está fazendo com que a consulta acerte o índice duas vezes, então sempre será mais lento.

Por favor, não me chame, estou apenas tentando ser educado.

    
por Jose 22.12.2009 / 17:53

1 resposta

1

No índice em AdjustDetailID, inclua as colunas Fee e FeeTax. Caso contrário, o sistema precisará fazer uma pesquisa para obter esses dados, e o sistema provavelmente acabará fazendo uma varredura, ignorando seu índice.

    
por 22.12.2009 / 21:54