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.

77 domande

15 risposte

4 commenti

43,644 utenti

Tag popolari


Ordine di esecuzione di query

+1 voto
3,085 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,900 punti)

Domande correlate

0 voti
0 risposte 2,831 visite
2,831 visite quesito posto 7 Dicembre 2013 in Performance Tuning da carlo10 (1,900 punti)
+1 voto
1 risposta 923 visite
923 visite quesito posto 8 Luglio 2014 in Performance Tuning da gr_g (130 punti)
0 voti
0 risposte 2,458 visite
2,458 visite quesito posto 3 Dicembre 2013 in SQL e PLSQL da carlo10 (1,900 punti)
0 voti
0 risposte 2,517 visite
2,517 visite quesito posto 11 Dicembre 2013 in Performance Tuning da carlo10 (1,900 punti)
+1 voto
1 risposta 185 visite
...