Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Unterschied zwischen WITH-Klausel und Unterabfrage?

Der WITH -Klausel ist für das Faktorisieren von Unterabfragen, auch 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 an mehreren Stellen in der Abfrage auf den Unterabfrageblock 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 haben Sie temp_table genannt ist eine Inline-Ansicht, keine temporäre Tabelle.

In vielen Fällen hängt die Wahl davon von Ihrem bevorzugten Stil ab, und CTEs können den Code lesbarer machen, insbesondere mit mehreren Ebenen von Unterabfragen (die Meinungen gehen natürlich auseinander). Wenn Sie sich nur einmal auf die CTE-/Inline-Ansicht beziehen, werden Sie wahrscheinlich keinen Unterschied in der Leistung feststellen, und der Optimierer kann am Ende denselben Plan haben.

Sie sind jedoch besonders nützlich, wenn Sie dieselbe Unterabfrage an mehr als einer Stelle verwenden müssen, z. B. in einer Union. Sie können eine Inline-Ansicht in einen CTE ziehen, sodass der Code nicht wiederholt wird, und es dem Optimierer ermöglicht, ihn zu materialisieren, wenn er dies für vorteilhaft hält.

Zum Beispiel dieses erfundene Beispiel:

select curr from (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr >= 0
union all
select -1 * curr from (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr < 0

könnte umgestaltet werden zu:

with temp_table as (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
)
select curr from temp_table
where curr >= 0
union all
select -1 * curr from temp_table
where curr < 0

Die Unterabfrage muss nicht mehr wiederholt werden. Je komplizierter der wiederholte Code ist, desto vorteilhafter ist es aus Wartungssicht, einen CTE zu verwenden. Und je teurer die Unterabfrage ist, desto mehr Leistungsvorteile könnten Sie erzielen sehen, wenn Sie einen CTE verwenden, obwohl der Optimierer normalerweise sowieso ziemlich gut darin ist, herauszufinden, was Sie tun.