Estou ingressando em uma tabela pequena (1.000 linhas) em uma tabela grande (8M linhas) no SQL Server 2008. A associação usa um índice de cobertura não clusterizado na tabela grande e a associação pode produzir três possíveis planos de consulta. Estou tentando descobrir qual plano é melhor, mas também quero generalizar esse conhecimento para que da próxima vez eu possa saber melhor quais heurísticas usar ao analisar as estatísticas de E / S do SQL.
O plano 1 é uma junção de loop e emite estatísticas para a tabela grande como esta:
Scan count 2582, logical reads 35686, physical reads 1041, read-ahead reads 23052
O plano 2 é uma junção de mesclagem e emite estatísticas como esta:
Scan count 1, logical reads 59034, physical reads 49, read-ahead reads 59004
O plano 3 é uma junção de hash e emite estatísticas como esta:
Scan count 3, logical reads 59011, physical reads 5, read-ahead reads 59010
O índice de cobertura é ordenado por (ID, Date). A consulta retorna dados para cerca de 50% dos IDs e, para cada ID, retorna um pedaço contíguo dos três meses mais recentes de dados, que geralmente é de cerca de 1/4 ou das linhas para cada ID. A consulta retorna cerca de 1/8 do total de linhas no índice. Em outras palavras, a consulta é esparsa, mas consistente.
Suponho que o plano 1 seja péssimo para essa carga de trabalho, porque mover a cabeça do disco cerca de 2.500 vezes (ou até 1.041 vezes) é muito mais caro do que uma varredura seqüencial de disco. Também presumo que os nºs 3 e 2 tenham padrões de E / S semelhantes e sequenciais (e, portanto, mais eficientes).
Mas existe um caso em que o plano nº 1 é realmente melhor, em que "melhor" significa menos impacto no subsistema de E / S e menos impacto em outras consultas em execução simultaneamente?
Ou realmente depende de muitas variáveis, como o tipo de subsistema de disco que tenho, fragmentação de índice etc. Se "depende", existem regras práticas para abordar o problema?