Oltre alla risposta esauriente di Craig, volevo aggiungere che la copertina del libro a cui fai riferimento dice:
Copre Oracle, DB2 e SQL Server
Quindi non mi fiderei che sia una grande fonte di consigli su PostgreSQL in particolare. Ogni RDBMS può essere sorprendentemente diverso!
Sono un po 'confuso riguardo alla tua domanda originale, ma ecco un esempio che mostra che la sezione del libro non è corretta al 100%. Per evitare ulteriore confusione, ecco l'intero paragrafo pertinente, puoi vederlo in Google Ricerca Libri .
Il database presuppone che Indexed_Col IS NOT NULL copra un intervallo troppo ampio per essere utile, quindi il database non guiderà verso un indice da questa condizione. In rari casi, avere un valore non nullo è così raro che è utile una scansione dell'intervallo di indice su tutti i possibili valori non nulli. In questi casi, se riesci a capire un limite inferiore o superiore sicuro all'intervallo di tutti i possibili valori, puoi abilitare una scansione dell'intervallo con una condizione come Positive_ID_Column> -1 o Date_Column> TO_DATE ('0001/01/01' , "AAAA / MM / GG").
Postgres può effettivamente (nel seguente caso inventato) utilizzare un indice per soddisfare le IS NOT NULL
query senza aggiungere kludges di scansione di intervallo come quello suggerito Positive_ID_Column > -1
. Vedi i commenti sulle domande di Craig sul perché Postgres scelga questo indice in questo caso particolare e la nota sull'uso di indici parziali.
CREATE TABLE bar (a int);
INSERT INTO bar (a) SELECT NULL FROM generate_series(1,1000000);
INSERT INTO bar (a) VALUES (1);
CREATE INDEX bar_idx ON bar (a);
EXPLAIN ANALYZE SELECT * FROM bar WHERE a IS NOT NULL;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Index Only Scan using bar_idx on bar (cost=0.42..8.44 rows=1 width=4) (actual time=0.094..0.095 rows=1 loops=1)
Index Cond: (a IS NOT NULL)
Heap Fetches: 1
Total runtime: 0.126 ms
(4 rows)
Questo è Postgres 9.3 a proposito, ma credo che i risultati sarebbero approssimativamente simili su 9.1, anche se non userebbe una "Scansione solo indice".
Modifica: Vedo che hai chiarito la tua domanda originale e apparentemente ti stai chiedendo perché Postgres non stia usando un indice in un semplice esempio come:
CREATE TABLE my_table(
a varchar NOT NULL
);
CREATE INDEX ix_my_table ON my_table(a);
SELECT a from my_table;
Probabilmente perché non ci sono righe nella tabella. Quindi aggiungi alcuni dati di test e ANALYZE my_table;
.