economia news e media viaggi informatica internet salute e benessere int rattenimento e spettacolo sport tempo libero istruzio ne e formazione arte cultura scienza

Ottimizzazione

Ottimizzazione delle query (terza parte)

A cura di Andrea Silvestri

Pubblicato il 09/12/2001

Ottimizzazione di un database PostgreSQL: utilizzo dell'EXPLAIN.

L'aver definito un indice su una tabella non implica che questo venga utilizzato sempre (anche se sono rispettate le condizioni definite negli interventi precedenti). Ogni query, prima d di essere eseguita viene analizzata dall'ottimizzatore che decide il modo piu' performante per eseguirla.
Una volta definiti gli indici quindi, e' necessario verificare se il sistema li utilizza.
A questo scopo esiste l'istruzione EXPLAIN che mostra come verrebbe eseguita l'istruzione, senza eseguirla realmente (mostra quindi il piano di esecuzione generato dall'ottimizzatore).
Le informazioni fornite dalla explain sono:

  • Tipo di accesso alle tabelle (sequenziale o indicizzato)
  • Stima dei costi
  • Stima del numero di record estratti
  • Stima della dimensione media (in byte) dei record estratti
Consideriamo alcuni esempi:

EXPLAIN SELECT * FROM tabella;

La risposta sara' qualcosa del tipo:

NOTICE: QUERY PLAN:
Seq Scan on tabella (cost=.... rows=.. width=..)

Non avendo specificato una condizione e' chiaro che l'accesso sara' di tipo sequenziale.
Nel caso della query:

EXPLAIN SELECT * FROM tabella where id=1;

supponendo che sia stato definito un indice sulla colonna id e che l'ottimizzatore ritenga necessario utilizzarlo, ci aspettiamo un output tipo:

NOTICE: QUERY PLAN:
Index Scan using nomeindice on tabella (cost=.... rows=.. width=..)

Nel caso di una query che mette in join due tabelle:

explain select * from t1, t2
where col1 = col2;

un possibile output della explain potrebbe essere:

NOTICE: QUERY PLAN:
Merge Join (cost=.... rows=.. width=..)
-> Sort (cost=.... rows=.. width=..)
-> Seq Scan on t2 (cost=.... rows=.. width=..)
-> Sort (cost=.... rows=.. width=..)
-> Seq Scan on t1 (cost=.... rows=.. width=..)

Le due tabelle sono messe in join tramite col1 e col2. Entrambe vengono lette in sequenza e ordinate; infine i record estratti vengono filtrati dalla merge join in modo da produrre il risultato finale. Gli altri due metodi possibili sono hash join e nested loop. Allo scopo di ottimizzare l'esecuzione di una select conviene quindi analizzare l'explain prima e dopo la definizione dell'indice in modo da poter valutare se l'indice verra' utilizzato ed eventualmente la differenza in termini di costi in modo da poter decidere se sia il caso di mantenerlo o se definirne uno differente o farne a meno.

I link correlati all'argomento

Vuoi essere aggiornato sulle novità della guida?

Feed RSS XML vostro feed RSS