Questo sito contribuisce alla audience di

Ottimizzazione delle query (terza parte)

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.

Le categorie della guida