Ich habe dieses eine Weile schon gekämpft. Ich habe eine gespeicherte Prozedur, die 3 Parameter verwendet, die zum Filtern verwendet werden. Wenn ein bestimmter Wert übergeben wird, möchte ich darauf filtern. Wenn -1 übergeben wird, gib mir alles.T-SQL Where Clause Fall Anweisung Optimierung (optionale Parameter zu StoredProc)
Ich habe es versucht, die folgenden zwei Möglichkeiten:
Erster Weg:
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
Zweiter Weg:
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)
ich irgendwo gelesen, dass der zweite Weg kurzgeschlossen wird und nie Eval der zweite Teil wenn wahr. Mein Datenbankadministrator hat angegeben, dass ein Tabellenscan erzwungen wird. Ich habe das nicht verifiziert, aber es scheint in einigen Fällen langsamer zu laufen.
Die Haupttabelle, dass diese Ansicht von wählt hat irgendwo rund 1,5 Millionen Datensätze, und die Ansicht Erlös etwa 15 andere Tabellen verknüpfen auf ein paar anderen Informationen zu sammeln.
Beide Methoden sind langsam ... mich von einem Augenblick nehmen, um überall 2-40 Sekunden, was in meiner Situation völlig inakzeptabel ist.
Gibt es eine bessere Art und Weise, die es nicht in jedem einzelnen Fall spezifischer Bruch mit sich bringt nach unten vs -1?
Jede Hilfe wird geschätzt. Vielen Dank.
Verdammt. Beat mich dazu. +1 :) – DVK
Die erste Option liefert nicht unbedingt die gleichen Ergebnisse wie die zweite. Wenn Sie Zeilen in Ihrer Tabelle mit NULL-Werten haben, werden sie von der Abfrage "Option 1" NICHT zurückgegeben. Zum Beispiel .... Wählen Sie * Aus Tabelle Wobei NullableColumn = NullableColumn –
Alle drei parms sind NICHT NULL, das ist also kein Problem in diesem Fall. Sieht so aus, als ob ich bei Option 1 steckengeblieben wäre. – IronicMuffin