Oracle
 sql >> Database >  >> RDS >> Oracle

Differenza tra clausola WITH e sottoquery?

Il WITH La clausola è per il factoring delle sottoquery, noto anche come espressioni di tabelle comuni o CTE:

La clausola WITH query_name consente di assegnare un nome a un blocco di sottoquery. È quindi possibile fare riferimento al blocco di sottoquery in più punti della query specificando query_name. Oracle Database ottimizza la query trattando il nome della query come una vista in linea o come una tabella temporanea.

Nel tuo secondo esempio, quello che hai chiamato temp_table è una vista in linea, non una tabella temporanea.

In molti casi la scelta di quale utilizzare dipende dal tuo stile preferito e le CTE possono rendere il codice più leggibile, in particolare con più livelli di sottoquery (le opinioni variano ovviamente). Se fai riferimento alla visualizzazione CTE/inline solo una volta, probabilmente non vedrai alcuna differenza nelle prestazioni e l'ottimizzatore potrebbe ritrovarsi con lo stesso piano.

Sono particolarmente utili quando è necessario utilizzare la stessa sottoquery in più di un luogo, ad esempio in un'unione. Puoi estrarre una vista in linea in un CTE in modo che il codice non venga ripetuto e consente allo strumento di ottimizzazione di materializzarlo se ritiene che sarebbe vantaggioso.

Ad esempio, questo esempio forzato:

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

potrebbe essere rifattorizzato in:

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

La sottoquery non deve più essere ripetuta. Più complicato è il codice ripetuto, più vantaggioso è dal punto di vista della manutenzione utilizzare un CTE. E più costosa è la sottoquery, maggiore è il vantaggio in termini di prestazioni che potresti vedere dall'uso di un CTE, anche se l'ottimizzatore di solito è abbastanza bravo a capire cosa stai facendo comunque.