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 (seconda parte)

A cura di Andrea Silvestri

Pubblicato il 29/11/2001

Ottimizzazione di un database PostgreSQL: definizione degli indici.

In Postgres esistono 3 tipi di indici, ognuno dei quali si basa su un diverso algoritmo:

  • B-tree
    Sono gli indici creati di default e sono particolarmente adatti alle query che utilizzano i seguenti operatori: <, <=, =, >=, > . Esempio:
    CREATE INDEX nome-indice ON nome-tabella(elenco-campi);
  • R-tree
    Le query che usufruiscono di questi indici sono quelle che utilizzano i seguenti operatori: <<, &<, &>, >>, @, ~=, &&
    In fase di creazione dell'indice si deve specificare che si intende crearne uno di questo tipo:
    CREATE INDEX nome-indice ON nome-tabella USING RTREE (elenco-campi);
  • Hash
    Questo genere di indice e' indicato quando si confronta l'uguaglianza fra due campi.
    Anche in questo caso e' necessario specificare, in fase di creazione, il tipo di indice:
    CREATE INDEX nome-indice ON nome-tabella USING HASH (elenco-campi);
Come gia' accennato nel precedente intervento, un indice puo' essere definito su piu' campi. In questo caso e' necessario indicare per primi quelli che vengono utilizzati piu' spesso nelle query. Postgres non fa eccezione, se ad esempio, si definisce un indice su tre colonne c1, c2, c3; questo viene utilizzato nel caso in cui nella condizione di where vengano utilizzate le colonne c1, c2, c3 oppure c1,c2 o c1. Nel caso c1, c3 verrebbe utilizzato l'indice solo per la colonna c1.
Esistono alcune limitazioni all'uso degli indici definiti su piu' campi:
  • Sono supportati solo dai B-Tree
  • Sono utilizzati solo con l'operatore AND
  • Il numero di colonne puo' essere al massimo 16
  • Generalmente gli indici su piu' di tre colonne sono poco performanti e quindi inutili
Anche in Postgres e' possibile definire indici unici, cioe' che non contengono valori ripetuti (escluso il NULL):

CREATE UNIQUE INDEX nome-indice
ON nome-tabella (elenco-campi);

Questo genere di indici viene creato automaticamente per le primary key e per gli unique.
Anche in questo caso e' possibile definire indici unici solo per i B_Tree.
In Postgres e' possibile definire indici basati sul risultato di una funzione applicata ad una o piu' colonne della tabella.
Per comprenderne l'utilita' supponiamo di dover eseguire spesso una query di questo tipo:

select * from tabella
where upper(col1) = valore

Un indice definito sul campo col1 non verrebbe utilizzato in quanto la funzione upper ne modifica il valore che non e' quindi confrontabile con quello memorizzato nell'indice.
In questo caso e' necessario definire un indice calcolato con la funzione upper:

CREATE INDEX nome-indice ON tabella (upper(col1));

Questo tipo di indice e' sempre composto da una sola colonna.

Vuoi essere aggiornato sulle novità della guida?

Feed RSS XML vostro feed RSS