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.
Tags und Links sql oracle common-table-expression subquery