Die Verwendung von IF in T-SQL schwächt oder bricht das Zwischenspeichern von Ausführungsplänen ab?

20

Mir wurde vorgeschlagen, dass die Verwendung von IF-Anweisungen in t-SQL-Batches die Leistung beeinträchtigt. Ich versuche, eine Bestätigung zu finden oder diese Behauptung zu bestätigen. Ich verwende SQL Server 2005 und 2008.

Die Behauptung ist, dass mit der folgenden Charge:

IF @parameter = 0
 BEGIN
  SELECT ... something
 END

ELSE
 BEGIN
  SELECT ... something else
 END

SQL Server kann den generierten Ausführungsplan nicht wiederverwenden, da für die nächste Ausführung möglicherweise ein anderer Zweig erforderlich ist. Dies impliziert, dass SQL Server einen Zweig vollständig aus dem Ausführungsplan entfernt, auf der Grundlage, dass es für die aktuelle Ausführung bereits bestimmen kann, welcher Zweig benötigt wird. Ist das wirklich wahr?

Außerdem, was passiert in diesem Fall:

IF EXISTS (SELECT ....)
 BEGIN
  SELECT ... something
 END

ELSE
 BEGIN
  SELECT ... something else
 END

Wo ist es nicht möglich im Voraus zu bestimmen, welche Verzweigung ausgeführt wird?

AnthonyWJones
quelle
1
SQL Server kann den Ausführungsplan wiederverwenden, da nur die in den Zweigen enthaltenen Anweisungen berücksichtigt werden.
MartinC

Antworten:

10

SQL Server optimiert den Prozess der Kompilierung des Abfrageplans für die gespeicherte Prozedur, indem die bedingten Verzweigungen in der gespeicherten Prozedur ignoriert werden. Der Plan wird auf der Grundlage der für die erste Ausführung verwendeten Parameter erstellt. Dies führt zu Problemen, wenn die Parameter für die Zweige unterschiedlich sind.

Ich würde die SQL für jeden Zweig in eine eigene gespeicherte Prozedur einfügen, sodass der generierte Plan auf der tatsächlichen Verwendung von Parametern für diesen Zweig basiert.

MartinC
quelle
6

Die einzige Abkürzung wird sein IF 1 = 1

Sowohl @Parameter als auch EXISTS müssen für den "allgemeinen Fall" ( @parameter = 42etwa) noch verarbeitet werden.

Sagen wir das ... was sagt der eigentliche Ausführungsplan und der Profiler, der Rekomplitionsereignisse aufzeichnet? (Ich mag keine geschätzten Pläne gemäß Jaos Antwort.)

gbn
quelle
3

Versuchen Sie, den geschätzten Ausführungsplan anzuzeigen, nicht den tatsächlichen. Sie werden sehen, dass der erste CONDOperator enthält .

Dieser Operator wurde auch in den zwischengespeicherten Ausführungsplan aufgenommen. In Ihrem Beispiel enthält der geschätzte Ausführungsplan einen COND-Operator und 2 SELECT-Zweige und ist daher vollständig wiederverwendbar. Denn bei der Ausführung eines Stapels wertet SQL Server nicht nur DML-Anweisungen, sondern auch alle anderen aus und bezieht sie aus dem Plan.

Der interne Ausführungsplan ist eine Struktur ähnlich dem Ausdrucksbaum.

Tom V - Team Monica
quelle
0

Pläne werden auf der Grundlage der übergebenen Parameter erstellt. In der Realität würde ich also Nein sagen. Eine bedingte Logik, die normalerweise auf Parametern basiert, ist für die Leistung nicht nachteilig.

Es werden mehrere Pläne erstellt, vorausgesetzt, die Parameter verursachen eine ausreichende Abweichung, damit das Abfrageoptimierungsprogramm dies bemerkt.

Sie können sehen, welche Aktionen ausgeführt werden, indem Sie den Show Execution-Plan einschalten und die Skripte ausführen. Beachten Sie die Unterschiede im Plan. Wenn Sie die Prozeduren ausführen (ich gehe hier von gespeicherten Prozeduren aus), werden Sie feststellen, dass das erste Mal im Allgemeinen schneller ist und der zweite Treffer den gespeicherten Plan verwendet. Ändern Sie die Parameter und wiederholen Sie den Vorgang, und führen Sie dann die ursprünglichen Parameter aus. Theoretisch befindet sich der Plan immer noch im Cache. Dies hängt jedoch von der Servernutzung ab (Cache-Ticks - sie bleiben nicht für immer erhalten.) Usw.

Barry King
quelle
0

Möglicherweise wurde es in den Jahren 2005 und 2008 verbessert, aber die Verwendung von Bedingungen im Jahr 2000 wäre mit größerer Wahrscheinlichkeit schlechter als von Ihnen beschrieben. Es würde einen Plan erstellen, um den ersten Durchlauf der Prozedur am besten zu handhaben, und dann diesen Plan verwenden, um die Prozedur auch dann auszuführen, wenn die Bedingungen erfüllt sind geändert. Nach meiner Erfahrung führten dies dazu, dass Abfragen, die in Minuten ausgeführt wurden, in Stunden ausgeführt wurden. Obwohl ich jetzt 2008 verwende und 2005 verwende, kann ich nicht kommentieren, wie die Coditionals dort funktionieren, da ich sie nicht mehr verwende.


quelle
2
2005+ hat Statement - Ebene neu kompiliert , so dass Sie haben „einen Plan pro sp“ die ganze Zeit mehr nicht jeder
GBN