2015-05-06 3 views

Antwort

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).

18

Die WITH Klausel ist für subquery factoring, auch als allgemeine Tabellenausdrücke oder CTEs bekannt:

Die WITH QUERY_NAME Klausel können Sie einen Namen in einer Unterabfrage Block 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, mit Ihrem bevorzugten Stil zusammen, und CTEs können Code lesbarer machen, insbesondere mit mehreren Ebenen von Unterabfragen (Meinungen variieren natürlich). Wenn Sie nur auf den CTE/Inline-View beziehen, sobald Sie wahrscheinlich keinen Unterschied in der Leistung sehen, und der Optimierer mit dem gleichen Plan kann am Ende.

Sie sind aber besonders nützlich, wenn Sie die gleiche Unterabfrage in mehr als ein Ort, wie zum Beispiel in einer Union verwenden müssen. Sie können eine Inline-Ansicht heraus in einen CTE ziehen, so der Code nicht wiederholt wird, und es ermöglicht die optimiser es zu materialisieren, wenn es so denkt, von Vorteil wäre.

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 Refactoring:

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 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 Performance-Nutzen können Sie von der Verwendung eines CTE sehen, obwohl der Optimierer normalerweise ziemlich gut darin ist herauszufinden, was Sie ohnehin tun.

+0

Dank Alex. Es ist nützlich. –