J'associe une petite table (1 000 lignes) à une grande table (8 M lignes) dans SQL Server 2008. La jointure utilise un index de couverture non clusterisé sur la grande table, et la jointure peut produire trois plans de requête possibles. J'essaie de comprendre quel plan est le meilleur, mais je veux aussi généraliser ces connaissances afin que la prochaine fois je puisse mieux connaître les heuristiques à utiliser lors de l'examen des statistiques d'E / S SQL.
Le plan n ° 1 est une jointure en boucle et émet des statistiques pour la grande table comme ceci:
Scan count 2582, logical reads 35686, physical reads 1041, read-ahead reads 23052
Le plan n ° 2 est une jointure de fusion et émet des statistiques comme celle-ci:
Scan count 1, logical reads 59034, physical reads 49, read-ahead reads 59004
Le plan n ° 3 est une jointure par hachage et émet des statistiques comme celle-ci:
Scan count 3, logical reads 59011, physical reads 5, read-ahead reads 59010
L'indice de couverture est ordonné par (ID, Date). La requête renvoie des données pour environ 50% des ID et, pour chaque ID, renvoie un bloc contigu des 3 mois de données les plus récents, qui représente généralement environ 1/4 ou les lignes de chaque ID. La requête renvoie environ 1/8 du total des lignes de l'index. En d'autres termes, la requête est clairsemée, mais de manière cohérente.
Mon hypothèse est que le plan n ° 1 est horrible pour cette charge de travail, car déplacer la tête de disque environ 2500 fois (ou même 1041 fois) est beaucoup plus cher qu'une analyse de disque séquentielle. Je suppose également que # 3 et # 2 ont des modèles d'E / S similaires, séquentiels (et donc plus efficaces).
Mais existe-t-il un cas où le plan n ° 1 est vraiment le meilleur, où "le meilleur" signifie moins d'impact sur le sous-système d'E / S et moins d'impact sur d'autres requêtes exécutées simultanément?
Ou cela dépend-il vraiment de nombreuses variables comme le type de sous-système de disque que j'ai, la fragmentation d'index, etc. Si "cela dépend", y a-t-il des règles générales pour aborder le problème?