Selain jawaban menyeluruh Craig, saya ingin menambahkan bahwa sampul buku yang Anda referensi mengatakan:
Meliputi Oracle, DB2 & SQL Server
Jadi saya tidak akan mempercayainya untuk menjadi sumber saran yang bagus tentang PostgreSQL pada khususnya. Setiap RDBMS bisa sangat berbeda!
Saya agak bingung tentang pertanyaan awal Anda, tetapi inilah contoh yang menunjukkan bahwa bagian buku ini tidak 100% benar. Untuk menghindari kebingungan lebih lanjut, inilah keseluruhan paragraf yang relevan, Anda dapat melihatnya di Pencarian Buku Google .
Basis data mengasumsikan bahwa Indexed_Col BUKAN NULL mencakup rentang yang terlalu besar untuk berguna, sehingga basis data tidak akan mengarahkan ke indeks dari kondisi ini. Dalam kasus yang jarang terjadi, memiliki nilai nonnull sangat jarang sehingga pemindaian rentang indeks atas semua nilai nonnull yang mungkin bermanfaat. Dalam kasus seperti itu, jika Anda dapat mengetahui batas bawah atau atas yang aman untuk kisaran semua nilai yang mungkin, Anda dapat mengaktifkan pemindaian rentang dengan kondisi seperti Positive_ID_Column> -1 atau Date_Column> TO_DATE ('0001/01/01' , 'YYYY / MM / DD').
Postgres sebenarnya dapat (dalam kasus yang dibuat berikut) menggunakan indeks untuk memenuhi IS NOT NULL
kueri tanpa menambahkan kludges pindai rentang seperti yang disarankan Positive_ID_Column > -1
. Lihat komentar pada pertanyaan Craig mengapa Postgres memilih indeks ini dalam kasus khusus ini, dan catatan tentang menggunakan indeks parsial.
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)
Ngomong-ngomong, ini adalah Postgres 9.3, tapi saya yakin hasilnya akan hampir sama pada 9.1, meskipun tidak akan menggunakan "Indeks Hanya Pindai".
Sunting: Saya melihat Anda telah mengklarifikasi pertanyaan awal Anda, dan Anda tampaknya bertanya-tanya mengapa Postgres tidak menggunakan indeks dalam contoh sederhana seperti:
CREATE TABLE my_table(
a varchar NOT NULL
);
CREATE INDEX ix_my_table ON my_table(a);
SELECT a from my_table;
Mungkin karena Anda tidak memiliki baris di tabel. Jadi tambahkan beberapa data uji dan ANALYZE my_table;
.