Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi cette requête n'utilise-t-elle pas l'index approprié ?

Il ne sait pas quelle sera la valeur des variables lorsqu'il compilera la requête. Vous pouvez essayer OPTION (RECOMPILE) .

Je suppose que l'ajout du AND clause dans la requête (même si logiquement elle ne la rend pas du tout plus sélective) doit tromper l'optimiseur en lui faisant estimer la requête avec une plus grande sélectivité vous donnant ainsi le plan que vous vouliez !

Vous dites dans les commentaires que la version sans le ExceptionDate = ExceptionDate est estimé à 88234.8 lignes et la version avec 8823.48

Généralement, en l'absence de statistiques utilisables, SQL Server revient à l'heuristique en fonction du type d'opérateur de comparaison dans le prédicat.

Il suppose qu'un > prédicat retournera 30% des lignes par exemple et qu'un = prédicat renverra 10 % des lignes, il semble donc qu'il applique cela directement au résultat de la première estimation. Intéressant qu'il ne tienne pas compte du fait que l'égalité est contre la colonne elle-même ici !

cf. Meilleures pratiques pour la gestion des statistiques - Évitez d'utiliser des variables locales dans les requêtes