Je me demande s'il existe un moyen judicieux de réécrire la requête suivante afin que les index sur les colonnes soient utilisés par l'optimiseur?Comment optimiser l'utilisation de la clause "OU" lorsqu'elle est utilisée avec des paramètres (SQL Server 2008)
Create Procedure select_Proc1
@Key1 int=0,
@Key2 int=0
As
BEGIN
Select key3
From Or_Table
Where (@key1 =0 OR Key1 [email protected]) AND
(@key2 =0 OR Key2 [email protected])
END
GO
Même si des colonnes dans les clauses WHERE sont couvertes par des index, SQL Server ne peut pas utiliser ces indices. Cela soulève la question de savoir si quelque chose «bloque» l'utilisation des index. La réponse à cette question est oui - les coupables sont les paramètres et la condition "OU". Les paramètres ne sont pas couverts par des index, ce qui signifie que SQL Server ne peut utiliser aucun des index pour évaluer "@ key1 = 0" (condition qui s'applique également à @ key2 = 0). Effectivement, cela signifie que SQL Server ne peut pas utiliser les index pour évaluer la clause "@ key1 = 0 OU Key1 = @ key1" (comme la clause "OR" est l'union des lignes couvertes par les deux conditions). Le même principe s'applique également à l'autre clause (note 2). Cela conduit SQL Server à conclure qu'aucun index ne peut être utilisé pour extraire les lignes, laissant SQL Server utiliser la meilleure approche suivante: un index indexé
Comme vous le voyez, l'optimiseur SQL n'utilisera pas d'index sur les colonnes si les prédicats sont "OU" dans la clause WHERE. Une solution à ce problème consiste à séparer les requêtes avec la clause IF pour toutes les combinaisons possibles de paramètres.
S'il vous plaît lire cet article court pour obtenir une meilleure vue du problème: http://www.sql-server-performance.com/articles/per/optimize_or_clause_p1.aspx
Maintenant, ma question est, que devons-nous faire si les combinaisons possibles sont plus que seulement trois ou quatre? Ecrire une requête séparée pour chaque combinaison ne semble pas une solution rationnelle. Y a-t-il une autre solution de contournement pour ce problème?
Approche intéressante, je vais devoir rappeler que. Je suppose que cela s'appliquerait aussi à d'autres SGBDR comme Oracle, où 'OR' est terriblement inefficace. – Lucero
Est-ce le seul moyen? Que faire si la requête est plus compliquée (plus de clauses OR impliquées) – Meysam