Warning: count(): Parameter must be an array or an object that implements Countable in /membri/oraclefaq/qa-include/app/format.php on line 384
Ordine di esecuzione di query - Oracle FAQ - Il forum italiano su oracle
+1 voto
8.1k visite
quesito posto in Performance Tuning da (130 punti)
Ciao a tutti,

Sono nuovo nella programmazione in sql e plsql e avevo questo quesito da porvi.

Se io ho una query banale del genere:

SELECT ....

FROM (SELECT................)

WHERE condizione1

La condizione1 quand'è che viene valutata?????????

Viene prima eseguita la select all'interno della from e sul risultato di questa viene valutata la condizione1???

 
Grazie

1 Risposta

0 voti
risposta inviata da (2.4k punti)

L'unico modo per togliersi questo tipo di dubbi è quello di verificare il piano di accesso della query.

I client oracle hanno generalmente un tasto per visualizzarlo, se invece stai lavorando con sql plus devi digitare qualche comando in più, ti consiglio questo articolo:

http://docs.oracle.com/cd/B10500_01/server.920/a96533/ex_plan.htm

Oracle valuta il piano di accesso migliore secondo le statistiche che ha a disposizione, non esiste quindi una risposta assoluta alla tua domanda. Ti faccio un esempio:

SELECT *
FROM (SELECT e.employee_id, e.first_name, d.department_name 
               FROM hr.employees e, hr.departments d 
             WHERE e.department_id = d.department_id) a
WHERE a.department_name = 'Shipping';
 
Explain plan prima QueryIn questo caso viene effettuato prima il filtro sulla where condition e come seconda operazione viene risolta la join che si trova nel FROM.
 
Con una semplice hint sulla stessa query riusciamo però a modificare il piano di accesso in questo modo:
 
SELECT /*+ LEADING(e) */ *
FROM (SELECT e.employee_id, e.first_name, d.department_name 
               FROM hr.employees e, hr.departments d 
             WHERE e.department_id = d.department_id) a
WHERE a.department_name = 'Shipping';
 
Piano di accesso con Hint Leading
 
In questo caso viene prima risolta la query della FROM su cui viene poi applicato il filtro della WHERE CONDITION.
 
Come spesso accade (ma non sempre) il piano di accesso scelto da Oracle è il più efficiente.
 
 

Domande correlate


Warning: count(): Parameter must be an array or an object that implements Countable in /membri/oraclefaq/qa-include/app/format.php on line 384

Warning: count(): Parameter must be an array or an object that implements Countable in /membri/oraclefaq/qa-include/app/format.php on line 384

Warning: count(): Parameter must be an array or an object that implements Countable in /membri/oraclefaq/qa-include/app/format.php on line 384

Warning: count(): Parameter must be an array or an object that implements Countable in /membri/oraclefaq/qa-include/app/format.php on line 384

Warning: count(): Parameter must be an array or an object that implements Countable in /membri/oraclefaq/qa-include/app/format.php on line 384
0 voti
0 risposte 18.6k visite
+1 voto
1 risposta 1.5k visite
quesito posto 8 Luglio 2014 in Performance Tuning da gr_g (150 punti)
0 voti
1 risposta 2.6k visite
quesito posto 5 Aprile 2018 in SQL e PLSQL da gr_g (150 punti)
0 voti
0 risposte 20.5k visite
quesito posto 3 Dicembre 2013 in SQL e PLSQL da carlo10 (2.4k punti)
0 voti
0 risposte 4.7k visite
quesito posto 11 Dicembre 2013 in Performance Tuning da carlo10 (2.4k punti)
...