Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /membri/oraclefaq/qa-include/qa-db.php on line 66
Ordine di esecuzione di query - Oracle FAQ - Il forum italiano su oracle
Benvenuto in Oracle FAQ - Il forum italiano su oracle, dove potrai fare domande e ricevere risposte da altri membri della community.

76 domande

14 risposte

4 commenti

41,076 utenti

Tag popolari


Ordine di esecuzione di query

+1 voto
2,724 visite
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
quesito posto 30 Maggio 2014 in Performance Tuning da azf (130 punti)

1 Risposta

0 voti

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.
 
 
risposta inviata 31 Maggio 2014 da carlo10 (1,860 punti)

Domande correlate

0 voti
0 risposte 2,524 visite
2,524 visite quesito posto 7 Dicembre 2013 in Performance Tuning da carlo10 (1,860 punti)
+1 voto
1 risposta 908 visite
908 visite quesito posto 8 Luglio 2014 in Performance Tuning da gr_g (130 punti)
0 voti
0 risposte 2,313 visite
2,313 visite quesito posto 3 Dicembre 2013 in SQL e PLSQL da carlo10 (1,860 punti)
0 voti
0 risposte 2,422 visite
2,422 visite quesito posto 11 Dicembre 2013 in Performance Tuning da carlo10 (1,860 punti)
+1 voto
1 risposta 179 visite
...