Je me demande s'il existe un moyen judicieux de réécrire la requête suivante de manière à ce que les index sur les colonnes soient utilisés par l'optimiseur ?
CREATE PROCEDURE select_Proc1
@Key1 int=0,
@Key2 int=0
AS
BEGIN
SELECT key3
FROM Or_Table
WHERE (@key1 = 0 OR Key1 = @Key1) AND
(@key2 = 0 OR Key2 = @Key2)
END
GO
Selon cet article Comment optimiser l'utilisation de la clause "OR" lorsqu'elle est utilisée avec des paramètres ? par Preethiviraj Kulasingham :
Même si les colonnes du
WHERE
sont couvertes par des index, SQL Server n'est pas en mesure d'utiliser ces index. 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 clauseOR
état.Les paramètres ne sont pas couverts par des index, ce qui signifie que SQL Server ne peut utiliser aucun des index pour évaluer les paramètres suivants
@key1=0
(une condition qui s'applique également@key2=0
).En effet, cela signifie que SQL Server ne peut pas utiliser d'index pour évaluer la clause
@key1=0 OR Key1= @key1
(en tant queOR
est l'union des lignes couvertes par les deux conditions). Le même principe s'applique à l'autre clause (concernant la clé2). Cela conduit SQL Server à conclure qu'aucun index ne peut être utilisé pour extraire les lignes, ce qui l'amène à utiliser la meilleure approche suivante : un balayage d'index en grappe.
Comme vous le voyez, l'optimiseur SQL n'utilisera pas d'index sur les colonnes si les prédicats sont OR
ée dans le cadre de la WHERE
clause. Une solution à ce problème consiste à séparer les requêtes comportant une clause IF
pour toutes les combinaisons possibles de paramètres.
Ma question est la suivante : que faire si les combinaisons possibles sont plus nombreuses que trois ou quatre ? La rédaction d'une requête distincte pour chaque combinaison ne semble pas être une solution rationnelle.
Existe-t-il une autre solution pour résoudre ce problème ?