Supponiamo di avere una funzione PL/SQL
che restituisce un valore casuale che verrà utilizzato in un SQL sentence
sia come dati restituiti sia nella clausola Order by
.Oracle SQL: se utilizzo una funzione sia come campo che in ordine, viene valutata di nuovo?
Ora si potrebbe scrivere la clausola Order by
in tre "diversi" modi:
da Index
Select Foo,
MyFunction(Foo) orderField
From FooTable
Order By 2
Chiamando "di nuovo" la funzione
Select Foo,
MyFunction(Foo) orderField
From FooTable
Order By MyFunction(Foo)
Utilizzando l'alias del campo ordine
Select Foo,
MyFunction(Foo) orderField
From FooTable
Order By orderField
Il terzo modo è possibile in quanto la clausola Order By
è l'ultima del select da analizzare e quindi Oracle già conosce l'alias.
La mia domanda è, c'è qualche differenza nell'elaborazione o nella prestazione di queste tre domande? In particolare, il secondo implicherebbe che la chiamata MyFunction
venga valutata di nuovo?
ho cercato di scoprire cerchiamo la documentazione, e eseguendo alcune query da Rospo, oltre ad avere uno sguardo alla explain plan
, ma non abbiamo trovato nessuna differenza significativa fino ad ora.
La mia versione Oracle è 11.2.0.3.0, se questo è importante in qualsiasi modo.
Potrebbe forse dipendere se la funzione è deterministica o no? (Comunque, l'alias della colonna è il mio preferito.) – jarlh
@jarlh, potrebbe essere. Sono curioso di sapere se qualcuno conosce la risposta :-) –