Frage

Wie kann ich eine Abfrage erhalten, die eine oder in der WHERE-Klausel verwendet, um sich mit einer UNION während der Kompilierung in zwei Abfragen aufteilen? Wenn ich es manuell neu zu schreiben, die Abfrage der UNION Verwendung ist 100x schneller als die einzelne Abfrage, weil es effektiv verschiedene Indizes in jeder Abfrage der Union nutzen kann. Gibt es eine Möglichkeit, das Optimierungsprogramm diesen Ansatz machen?

Ich habe eine Abfrage, die etwa wie folgt aussieht:

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3
where conditions1 
    and ((@param1 is null and cond3a) or (cond3b))

Wo column, joincond2, joincond3 und Bedingungen1 sind alle mehr Ausdrücke. Der Kicker ist, dass nur eine der Bedingungen im OP immer wahr ist.

Ich dachte Zuerst konnte ich es einfach umschreiben die Vereinigung zu tun, aber dann wiederhole ich column, joincond2, joincond3 und Bedingungen1, die 20 oder so Linien von SQL sind, die viel Pflege in der Zukunft benötigen. Gibt es einen Hinweis, den ich liefern kann oder einige bessere Möglichkeit, die WHERE-Klausel zu schreiben? Vielen Dank im Voraus.

War es hilfreich?

Lösung

Sie können Gruppe

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3

in eine Sicht, und dann Vereinigung verwenden.

, aber wenn Sie zu sql2005 migrieren / 8, Sie können gemeinsamen Tabellenausdruck verwendet werden.

with cte ( columnlist )
as (
    select columnlist
    from table1
    join table2 on joincond2
    join table3 on joincond3 )
select columnlist from cte where ...
union
select columnlist from cte where ...

Andere Tipps

Versuchen Sie das Hinzufügen OPTION (RECOMPILE) auf die Abfrage. Wenn es in einer gespeicherten Prozedur ist dann fügen Sie WITH RECOMPILE zu dem auch. Es kann sein, dass das erste Mal, dass Sie die Abfrage SQL Server ausgeführt wird mit einem Plan und speichert es dann aber das zweite Mal durch es immer noch mit dem alten (und jetzt schlecht) Abfrage-Plan.

Sie werden einen kleinen Hit, weil es jedes Mal, wenn Sie die Abfrage neu kompiliert werden müssen, aber es wird im Vergleich zu der Verwendung eines schlechten Plans Minuskel sein.

EDIT: Ich habe gelesen, dass in SQL 2000 WITH RECOMPILE in einer gespeicherten Prozedur immer nicht richtig funktioniert. Der Fehler wurde angeblich in SQL Fest 2005. Ich habe noch nie den Fehler persönlich obwohl gestoßen, so dass ich weiß nicht, was der genaue Deal mit ihm ist. Probieren Sie es aber.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top