Le problème est que vous spécifiez deux conditions avec OR qui s'appliquent à des tables distinctes dans votre requête. Pour cette raison, la recherche d'index non clusterisé doit renvoyer la plupart ou la totalité des lignes de votre grande table, car la logique OR signifie qu'elles peuvent également correspondre à la clause de condition dans la deuxième table.
Examinez le plan d'exécution SQL dans les trois exemples ci-dessus et notez le nombre de lignes qui sortent de la recherche d'index non cluster à partir de la grande table. Le résultat final ne peut renvoyer que 1 000 ou moins des 800 000 lignes de la table, mais la clause OR signifie que le contenu de cette table doit être référencé avec le conditionnel dans la deuxième table puisque OR signifie qu'ils peuvent être nécessaires pour le final résultat de la requête.
En fonction de votre plan d'exécution, la recherche d'index peut extraire les 800 000 lignes de la grande table, car elles peuvent également correspondre aux conditions de la clause OR de la deuxième table. L'UNION ALL est deux requêtes distinctes sur une table chacune, de sorte que la recherche d'index n'a qu'à produire le plus petit ensemble de résultats qui pourrait correspondre à la condition de cette requête.
J'espère que cela a du sens. J'ai rencontré la même situation lors de la refactorisation d'instructions SQL lentes.
Bravo,
André Ranieri