
Parfois, les requĂȘtes lentes peuvent ĂȘtre corrigĂ©es en modifiant lĂ©gĂšrement la requĂȘte. Un tel exemple peut ĂȘtre illustrĂ© lorsque plusieurs valeurs sont comparĂ©es dans une clause WHERE Ă l'aide de l'opĂ©rateur OR ou IN. Souvent, un OU peut provoquer une analyse d'index ou de table, qui peut ne pas ĂȘtre le plan d'exĂ©cution prĂ©fĂ©rĂ© en termes de consommation d'E / S ou de vitesse globale de requĂȘte.
De nombreuses variables entrent en jeu lorsque l'optimiseur de requĂȘtes crĂ©e un plan d'exĂ©cution. Ces variables comprennent de nombreuses caractĂ©ristiques matĂ©rielles, les paramĂštres d'instance, les paramĂštres de base de donnĂ©es, les statistiques (table, index, auto-gĂ©nĂ©rĂ©), ainsi qu'un moyen d'Ă©crire une requĂȘte. Ici, nous changeons la façon dont nous Ă©crivons la demande. Peu importe Ă quel point cela peut paraĂźtre inattendu, mĂȘme si deux requĂȘtes diffĂ©rentes peuvent renvoyer les mĂȘmes rĂ©sultats, le chemin qu'elles suivent peut ĂȘtre complĂštement diffĂ©rent selon le format de la requĂȘte.
UNION vs OR
Pour la plupart de mon expĂ©rience avec SQL Server, OR est gĂ©nĂ©ralement moins efficace que UNION. Ce qui se produit gĂ©nĂ©ralement avec OR, c'est qu'il provoque souvent une analyse. Cela peut parfois ĂȘtre le meilleur moyen pour certains cas, et je le laisserai comme un article sĂ©parĂ©, mais en gĂ©nĂ©ral, j'ai constatĂ© que lorsqu'un grand nombre d'entrĂ©es sont affectĂ©es, c'est la principale raison de la lenteur. Commençons donc notre comparaison.
Voici notre instruction OR:
SELECT SalesOrderID, * FROM sales.SalesOrderDetail WHERE ProductID = 750 OR ProductID = 953

à partir de ce plan d'exécution, nous voyons que nous analysons 121 000 lignes. (Vous ne pouvez pas voir le nombre de lignes, mais c'est le cas).
Maintenant, nous exĂ©cutons la mĂȘme requĂȘte, mais Ă©crite en utilisant UNION au lieu de OR:
SELECT [SalesOrderID], * FROM sales.SalesOrderDetail WHERE ProductID = 750 UNION SELECT [SalesOrderID], * FROM sales.SalesOrderDetail WHERE ProductID = 953

Nous voyons ici deux branches d'opérations. Une branche affecte 358 lignes et les 346 autres lignes. Les deux branches effectuent une opération de concaténation qui combine les deux ensembles de résultats. Nous avons deux recherches distinctes, mais nous avons également une recherche de clé pour obtenir la liste SELECT requise. Cela n'était pas nécessaire pour l'opération de numérisation, car nous avons toujours affecté toutes les lignes de l'opération de numérisation, de sorte que les données ont été obtenues pendant l'analyse, pas aprÚs. Cela est dû à l'index et aux lignes dont nous avons besoin, pas à UNION ou OR. Cependant, je dirai que la sélection est également un facteur dans le choix d'une recherche par rapport à l'analyse, mais nous l'ignorerons dans cet article.
Explication
Pourquoi UNION provoque plus de recherches au lieu d'analyses, car chaque opération doit satisfaire à une certaine exigence de sélectivité afin de se qualifier pour une recherche. (La sélectivité est l'unicité d'une colonne filtrée particuliÚre). OU se produit en une seule opération, donc lorsque la sélectivité pour chaque colonne est combinée et dépasse un certain pourcentage, le balayage est alors considéré comme plus efficace.
Ătant donnĂ© qu'UNION effectue une opĂ©ration distincte pour chaque opĂ©rateur par dĂ©faut, la sĂ©lectivitĂ© de chaque colonne n'est pas combinĂ©e, ce qui lui donne une meilleure chance d'effectuer une recherche. Maintenant, comme UNION effectue deux opĂ©rations, ils doivent faire correspondre leurs jeux de rĂ©sultats Ă l'aide de l'opĂ©ration de concatĂ©nation dĂ©crite ci-dessus. Ce n'est gĂ©nĂ©ralement pas une opĂ©ration coĂ»teuse.
Il convient Ă©galement de noter que la clause OR fonctionne de la mĂȘme maniĂšre que l'instruction IN.
J'espÚre que cette astuce vous aidera. Je crois que cela est trÚs précieux lorsque vous travaillez avec des systÚmes qui nécessitent une concurrence élevée.