Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Indici
PrecedenteUNION, CASE, and Related ConstructsTipi di indiceSuccessivo

11. Indici

Gli indici sono un comune mezzo per migliorare le prestazioni del database. Un indice consente al server di database di trovare e recuperare le righe specifiche molto più velocemente di quanto potrebbe fare senza un indice. Ma essi rappresentano anche un carico aggiuntivo all'intero sistema di database, per cui dovrebbero essere usati assennatamente.

11.1. Introduzione

Supponendo di avere una tabella simile a questa:

CREATE TABLE test1 (
    id integer,
    content varchar
);

e che l'applicazione richiede molte query della forma:

SELECT content FROM test1 WHERE id = constant;

Senza una preparazione avanzata, il sistema dovrebbe scandire l'intera tabella test1, riga per riga, per cercare tutte le corrispondenze. Se ci sono molte righe in test1 e solo alcune di esse (forse solo zero o una) verrebbero restituite da una tale query, questo sarebbe chiaramente un metodo inefficiente. Ma se il sistema è stato istruito per mantenere un indice sulla colonna id, esso potrà usare un metodo più efficiente per localizzare le righe corrispondenti. Per esempio, è probabile che esso debba scorrere solo qualche livello in un albero di ricerca.

Un approccio simile è usato nei libri non-romanzeschi: i termini e i concetti che sono cercati frequentemente dai lettori sono raccolti in un indice alfabetico alla fine del libro. Il lettore interessato può scandire l'indice e andare alla pagina appropriata, senza dover leggere l'intero libro per trovare il materiale interessato. Come è incarico dell'autore prevedere gli elementi che i lettori ricercheranno, è compito del programmatore di database prevedere quali indici saranno vantaggiosi.

Per creare l'indice nella colonna id, come discusso sopra, si potrà usare il seguente comando:

CREATE INDEX test1_id_index ON test1 (id);

Il nome test1_id_index può essere scelto liberamente, ma bisogna scegliere qualcosa che consenta di ricordare in seguito per cosa è stato creato l'indice.

Per rimuovere un indice, usare il comando DROP INDEX. Gli indici possono essere aggiunti e rimossi dalle tabelle in qualsiasi momento.

Una volta creato l'indice, nessun intervento ulteriore è richiesto: Il sistema aggiornerà l'indice quando la tabella viene modificata, e lo utilizzerà nelle query quando pensa che il suo utilizzo sarà più efficiente rispetto ad una scansione sequenziale della tabella. Ma potreste dover attivare regolarmente il comando ANALYZE per aggiornare le statistiche in modo che il planner delle query prenda decisioni erudite. Consultare il Capitolo 14, Suggerimenti per migliorare le prestazioni per aver informazioni su come scoprire se un indice è usato e quando e perchè il planner potrebbe scegliere di non usare un indice.

Gli indici possono trarre beneficio dai comandi UPDATE e DELETE con le condizioni di ricerca. Gli indici possono essere inoltre usati nelle ricerche join. Per cui, un indice definito su una colonna che è parte di una condizione join può aumentare significativamente la velocità della query con join.

Creare un indice in una grande tabella può richiedere molto tempo. Per impostazione predefinita,PostgreSQL™ consente che le letture (select) avvengano sulla tabella in parallelo con la creazione di un indice, mentre le scritture (insert, update, delete) saranno bloccate fino a che la costruzione dell'indice non è finita. In ambienti di produzione questo è spesso inaccettabile. È possibile consentire alle scritture di verificarsi in parallelo con la creazione dell'indice, ma bisogna considerare diversi avvertimenti -- per ulteriori informazioni consultare Building Indexes Concurrently.

Dopo aver creato un indice, il sistema deve mantenerlo sincronizzato con la tabella. Questo aggiunge un carico alle operazioni di manipolazione dei dati. Per cui gli indici che vengono usati raramente o mai nelle query, dovrebbero essere rimossi.

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Indici
PrecedenteUNION, CASE, and Related ConstructsTipi di indiceSuccessivo