T-Clause SQL where Cas de Déclaration d'Optimisation (en option paramètres de procédure stockée)

J'ai été aux prises avec celui-ci pendant un certain temps maintenant. J'ai une procédure stockée qui prend 3 paramètres qui sont utilisés pour filtrer. Si une valeur spécifique est passé, je veux filtre. Si -1 est passé, de me donner tous.

Je l'ai essayé les deux façons suivantes:

Première façon:

SELECT field1, field2...etc  
FROM my_view  
WHERE  
parm1 = CASE WHEN @PARM1= -1 THEN parm1  ELSE @PARM1 END  
AND parm2 = CASE WHEN @PARM2 = -1 THEN parm2  ELSE @PARM2 END  
AND parm3 = CASE WHEN @PARM3 = -1 THEN parm3  ELSE @PARM3 END

Deuxième Façon:

SELECT field1, field2...etc  
FROM my_view  
WHERE  
(@PARM1 = -1 OR parm1 = @PARM1)  
AND (@PARM2 = -1 OR parm2 = @PARM2)  
AND (@PARM3 = -1 OR parm3 = @PARM3)  

J'ai lu quelque part que la deuxième façon de court-circuit et de ne jamais eval la deuxième partie, si vrai. Mon DBA dit il oblige à une analyse de la table. Je n'ai pas vérifié, mais il semble plus lent sur certains cas.

De la table principale, que ce point de vue sélectionne à partir de quelque part autour de 1,5 millions de disques, et le point de vue produit d'adhérer à environ 15 autres tables de recueillir un tas d'autres informations.

Ces deux méthodes sont lents...une prise de moi à partir de l'instant de n'importe où à partir de 2-40 secondes, ce qui dans ma situation est totalement inacceptable.

Est-il une meilleure manière qui n'implique pas de rupture vers le bas dans chaque cas séparé de spécifique vs -1 ?

Toute aide est appréciée. Merci.

OriginalL'auteur IronicMuffin | 2009-10-08