Piani di esecuzione in Oracle 0
Cos’è un piano di esecuzione
Quando viene eseguita una query in Oracle, come in tutti gli altri dbms, viene chiamato in causa un ottimizzatore (nel caso di Oracle ci sono due tipi di ottimizatori, uno basato su regole e uno basato sul costo di esecuzione) che genera una insieme di passi di esecuzione chiamato piano di esecuzione.
Questa passi non sono alto che la lista di operazioni che l’esecutore farà per restituire i risultati della query.
Sapere il piano di esecuzione di una query può risultare molto interessante per motivi prestazionali, infatti è possibile avere le informazioni basilari per decidere come modificare la nostra query per ottenere un tempo di esecuzione più basso.
Come visualizzare un piano
Vedere i piani di esecuzione è molto semplice, basta utilizzare lo statement EXPLAIN PLAN come ad esempio:
EXPLAIN PLAN SET STATEMENT_ID = 'un_id_che_volete' FOR SELECT a,b FROM table_test WHERE a > 10
Questo costrutto non restituisce direttamente un risultato, in questo modo il piano di esecuzione della select viene memorizzato in una tabella apposita per i piani di esecuzione la Plan Table (solitamente chiamata plan_table). Oracle fornisce uno script sql per la creazione di questa tabella solitamente chiamato utlxplan.sql (provate a fare una ricerca nel vostro filesystem del tipo *xplan*.sql).
Per vedere il piano di esecuzione sarà sufficiente eseguire una query gerarchica nella Plan Table come la seguente:
SELECT
LDAP(' ', 2*(level-1)) ||
operation || ' ' || options ||
' ' || object_name || ' ' ||
DECODE(id, 0, 'Cost = ' || position)
"Plan table output"
FROM plan_table
START WITH ID = 0 AND
statement_id = 'id_che_volete_esaminare'
CONNECT BY PRIOR id=parent_id AND
statement_id = 'id_che_volete_esaminare';
il risultato sarà qualcosa del genere:
Plan table output
--------------------------------------------------------
SELECT STATEMENT
SORT UNIQUE
NESTED LOOPS OUTER
NESTED LOOPS OUTER
NESTED LOOPS OUTER
NESTED LOOPS
HASH JOIN
TABLE ACCESS BY INDEX ROWID TABLE1
NESTED LOOPS
NESTED LOOPS
INDEX UNIQUE SCAN PK_TABLE2
TABLE ACCESS BY INDEX ROWID TABLE3
INDEX RANGE SCAN FDX_TABLE2_TABLE1
INDEX RANGE SCAN FDX_TABLE3_TABLE2
VIEW
HASH JOIN
HASH JOIN
TABLE ACCESS FULL TABLE4
TABLE ACCESS FULL TABLE5
TABLE ACCESS FULL TABLE6
TABLE ACCESS BY INDEX ROWID TABLE7
INDEX UNIQUE SCAN PK_TABLE7
TABLE ACCESS BY INDEX ROWID TABLE8
INDEX UNIQUE SCAN PK_TABLE8
TABLE ACCESS BY INDEX ROWID TABLE9
INDEX RANGE SCAN FDX_TABLE8_TABLE7
VIEW PUSHED PREDICATE
TABLE ACCESS BY INDEX ROWID TABLE10
NESTED LOOPS
TABLE ACCESS BY INDEX ROWID TABLE11
INDEX RANGE SCAN FDX_TABLE6_TABLE9
INDEX RANGE SCAN FDX_TABLE6_TABLE7
--------------------------------------------------------
Come leggere i risultati
La prima colonna riportata si riferisce all’operazione eseguita, la seconda è relativa alle opzioni ovvero come l’operazione è stata eseguita. Ci sono diversi tipi di opzione come ad esempio INDEX ROWID, RANGE SCAN, FULL ecc…
Nella terza, dove presente, vi è l’oggetto su cui viene applicata l’operazione.
Per saperne di più vi rimando al sito Oracle’s explain plan






