Archivio giugno 2008

Piani di esecuzione in Oracle 0

giu10

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

IT c.s.p. usa una versione modificata di FREEmium Theme.
Politiche sulla privacy - Copyright