Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Indici > Indici sulle espressioni
PrecedenteIndici uniqueIndici parzialiSuccessivo

11.7. Indici sulle espressioni

Una colonna indice non deve necessariamente essere una colonna della tabella sottostante, ma può essere una funzione o una espressione scalare calcolata da una o più colonne della tabella. Questa caratteristica è utile per ottenere accesso veloce alle tabelle basate sui risultati dei calcoli.

Per esempio, un modo comune per effettuare un confronto non sensibile alle maiuscole è quello di usare la funzione lower:

SELECT * FROM test1 WHERE lower(col1) = 'value';

Questa query può usare un indice, se è stato definito sul risultato della funzione lower(col1):

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));

Dichiarando questo indice UNIQUE, si impedisce la creazione di righe in cui i valori di col1 differiscono solo nel tipo di carattere (maiuscolo o minuscolo), oltre a quelle in cui i valori di col1 sono veramente identici. Per cui, gli indici nelle espressioni possono essere usati per far rispettare vincoli che non sono definibili come semplici vincoli unique.

Come ulteriore esempio, se si utilizzano spesso query come questa:

SELECT * FROM people WHERE (first_name || ' ' || last_name) = 'John Smith';

potrebbe essere utile la creazione di un indice come questo:

CREATE INDEX people_names ON people ((first_name || ' ' || last_name));

La sintassi del comando CREATE INDEX richiede normalmente di racchiudere tra parentesi le espressioni indice, come mostrato nel secondo esempio. Le parentesi possono essere omesse quando l'espressione è solo una chiamata di funzione, come nel primo esempio.

Le espressioni indice sono relativamente dispendiose da mantenere, perchè le espressioni derivate devono essere calcolate per ogni riga negli inserimenti ed ogni volta che c'è un aggiornamento. Tuttavia, le espressioni indice non vengono ricalcolate durante una ricerca indicizzata, dato che sono già memorizzate nell'indice. In ambedue gli esempi visti sopra, il sistema vede la query come WHERE colonnaindicizzata = 'costante' e quindi la velocità della ricerca è equivalente a qualsiasi altra semplice query indice. Per cui, gli indici nelle espressioni sono utili quando la velocità della ricerca è più importante della velocità di inserimento e di aggiornamento.

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Indici > Indici sulle espressioni
PrecedenteIndici uniqueIndici parzialiSuccessivo