Saya telah membaca buku ini yang mengatakan itu
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.
Saya menyadari bahwa buku itu sudah lebih dari 10 tahun, tetapi sudah terbukti cukup berguna - Dengan menggunakan instruksi yang diperoleh dari halaman-halamannya, saya telah mempercepat kueri dengan faktor sepuluh.
Selanjutnya, dalam menjalankan EXPLAIN ANALYZE
pada SELECT
query, saya telah menemukan bahwa tidak ada indeks saya sedang digunakan, bahkan ketika semua hak, mereka seharusnya.
Jadi, pertanyaan saya adalah:
Andaikata ada tabel yang memiliki kolom, yang definisi kolomnya mencakup "BUKAN NULL", dan bahwa ada indeks yang mencakup kolom ini, akankah indeks ini digunakan dalam kueri dari tabel itu di mana kolom merupakan bagian dari kueri?
Suka:
CREATE TABLE my_table(
a varchar NOT NULL
);
CREATE INDEX ix_my_table ON my_table(a);
SELECT a from my_table;
sumber
WHERE column IS NOT NULL
tidak dapat menggunakan indeks karena, seperti yang dikatakan buku: "mencakup rentang yang terlalu besar untuk berguna,". Jika 90% dari nilai-nilai tersebut tidak nol, seqscan mungkin akan lebih cepat juga.NOT NULL
kolom untukIS NOT NULL
kueri kecuali indeks itu juga berguna untuk bagian lain dariWHERE
klausa, bergabung dengan filter, dll, atau dapat digunakan untuk pemindaian hanya indeks yang dipesan. Dengan kata lain, itu akan sepenuhnya mengabaikan redundanIS NOT NULL
padaNOT NULL
kolom dan membuat pilihan penggunaan indeks berdasarkan detail lainnya. (Lihat edit, pindai ulang hanya indeks).Selain jawaban menyeluruh Craig, saya ingin menambahkan bahwa sampul buku yang Anda referensi mengatakan:
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 .
Postgres sebenarnya dapat (dalam kasus yang dibuat berikut) menggunakan indeks untuk memenuhi
IS NOT NULL
kueri tanpa menambahkan kludges pindai rentang seperti yang disarankanPositive_ID_Column > -1
. Lihat komentar pada pertanyaan Craig mengapa Postgres memilih indeks ini dalam kasus khusus ini, dan catatan tentang menggunakan indeks parsial.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:
Mungkin karena Anda tidak memiliki baris di tabel. Jadi tambahkan beberapa data uji dan
ANALYZE my_table;
.sumber
NOT NULL
, bukan permintaan yang digunakanIS NOT NULL
sebagai kondisi indeksnya. Ini ada dalam komentar yang Anda referensikan, tetapi saya akan memperbarui pertanyaan untuk memasukkannya.Anda belum mengirimkan kueri atau data contoh Anda. Tetapi alasan paling umum indeks tidak digunakan berkaitan dengan volume.
Indeks seperti buku telepon yang menerjemahkan kolom ke lokasi baris. Jika Anda hanya mencari beberapa baris, masuk akal untuk mencari setiap baris dalam buku telepon, dan kemudian mencari baris di tabel utama.
Tetapi untuk lebih dari beberapa baris, lebih murah untuk melewatkan buku telepon, dan beralih ke semua baris di tabel utama. Dalam pengalaman saya, titik kritis sekitar 100 baris.
sumber
CREATE INDEX ix_frank ON people(name) WHERE name ='frank'
.NOT NULL