Secara umum, col IS NULL
adalah kandidat yang memungkinkan untuk pencarian indeks b-tree (default). Manual :
Juga, IS NULL
atau IS NOT NULL
kondisi pada kolom indeks dapat digunakan dengan indeks B-tree.
Untuk mendapatkan bukti, nonaktifkan pemindaian berurutan (hanya dalam sesi tes!):
SET enable_seqscan = OFF;
Saya mengutip manualnya di sini :
enable_seqscan (boolean)
Mengaktifkan atau menonaktifkan penggunaan jenis rencana pemindaian sekuensial oleh perencana permintaan. Tidak mungkin untuk menekan pindaian berurutan sepenuhnya, tetapi mematikan variabel ini membuat perencana tidak menggunakannya jika ada metode lain yang tersedia. Standarnya aktif.
Kemudian coba lagi:
EXPLAIN ANALYZE SELECT * FROM tbl WHERE auto_renew IS NULL;
Ini mungkin akan menghasilkan pemindaian indeks bitmap yang lebih lambat daripada pemindaian berurutan di atas meja.
Atur ulang, atau tutup sesi (pengaturannya adalah sesi-lokal).
RESET enable_seqscan;
Indeks pada boolean
kolom hanya berguna dalam kasus-kasus tertentu. Perencana hanya menggunakan indeks jika mengharapkan itu lebih cepat. Perhitungan didasarkan pada pengaturan biaya Anda dan statistik yang dikumpulkan oleh ANALYZE
. Jika sebagian besar tabel cocok dengan kondisi Anda (sekitar 5% atau lebih, tergantung), biasanya lebih cepat melakukan pemindaian tabel penuh.
Ini meninggalkan nilai langka dalam boolean
kolom sebagai satu-satunya kandidat yang berguna untuk indeks biasa. Dan biasanya lebih efisien untuk membuat indeks parsial (lebih khusus) daripada ini - yang lebih murah untuk mempertahankan, lebih kecil, lebih cepat dan lebih mudah digunakan jika kondisi kueri cocok.
Jika Anda memiliki banyak kueri yang mencari baris auto_renew IS NULL
dan NULL
kasingnya tidak terlalu umum (dan / atau Anda memerlukan urutan pengurutan tertentu) maka indeks ini akan membantu menemukan / mengurutkan baris-baris ini dengan cepat:
CREATE INDEX index_tbl_tbl_id_auto_renew_null ON tbl (tbl_id)
WHERE auto_renew IS NULL;
Kondisi indeks parsial harus diulangi dalam WHERE
klausa kueri kurang lebih tepat untuk membuat perencana kueri menyadari indeks berlaku.
Kolom yang diindeks ( tbl_id
) adalah pilihan acak. Bagian yang penting adalah WHERE
klausa. Indeks khusus ini akan paling efektif untuk kueri dengan ORDER BY tbl_id
atau filter tambahan atau bergabung tbl_id
. Anda bisa menjadikannya indeks multikolom . Kolom Boolean seringkali lebih berguna dalam kombinasi dengan yang lain.
Selain: ORM adalah kruk yang secara teratur gagal mendapatkan potensi penuh dari RDBMS Anda.