Unterschied zwischen WITH-Klausel und Unterabfrage?

7

Was ist der Unterschied zwischen WITH -Klausel und Unterabfrage?

%Vor%     
Hari Rao 06.05.2015, 13:38
quelle

2 Antworten

18

Die WITH -Klausel gilt auch für Unterabfrage-Factoring bekannt als allgemeine Tabellenausdrücke oder CTEs:

  

Mit der Klausel WITH query_name können Sie einem Unterabfrageblock einen Namen zuweisen. Sie können dann auf den Unterabfrageblock mehrere Stellen in der Abfrage verweisen, indem Sie query_name angeben. Oracle Database optimiert die Abfrage, indem der Abfragename entweder als Inline-Ansicht oder als temporäre Tabelle behandelt wird.

In Ihrem zweiten Beispiel ist das, was Sie temp_table genannt haben, eine Inline-Ansicht, keine temporäre Tabelle.

In vielen Fällen hängt die Auswahl, die Sie verwenden müssen, von Ihrem bevorzugten Stil ab, und CTEs können Code besser lesbar machen, insbesondere mit mehreren Ebenen von Unterabfragen (die Meinungen variieren natürlich). Wenn Sie nur auf die CTE / Inline-Ansicht verweisen, werden Sie wahrscheinlich keinen Unterschied in der Leistung feststellen, und der Optimierer kann den gleichen Plan haben.

Sie sind jedoch besonders nützlich, wenn Sie die gleiche Unterabfrage an mehreren Stellen verwenden müssen, z. B. in einer Union. Sie können eine Inline-Ansicht in ein CTE ziehen, so dass der Code nicht wiederholt wird, und der Optimierer kann ihn materialisieren, wenn er dies für vorteilhaft hält.

Zum Beispiel dieses erfundene Beispiel:

%Vor%

könnte umgestaltet werden auf:

%Vor%

Die Unterabfrage muss nicht mehr wiederholt werden. Je komplizierter der wiederholte Code ist, desto vorteilhafter ist es aus Sicht der Wartung, einen CTE zu verwenden. Und je teurer die Unterabfrage ist, desto mehr Leistungsvorteile können Sie durch die Verwendung eines CTE erzielen, obwohl der Optimierer in der Regel ziemlich gut darin ist, herauszufinden, was Sie ohnehin tun.

    
Alex Poole 06.05.2015 13:50
quelle
0

Möglicherweise keine. Oracle ist zu vielen algebraischen Transformationen in der Lage, bevor die Abfrage tatsächlich optimiert wird. Wahrscheinlich werden beide Abfragen auf die gleiche Weise ausgewertet (sie haben den gleichen Ausführungsplan).

    
ibre5041 06.05.2015 13:50
quelle