Indeks parsial adalah ide yang bagus untuk mengecualikan setengah baris tabel yang jelas tidak Anda butuhkan. Lebih sederhana:
CREATE INDEX name_idx ON table (text_col)
WHERE text_col IS NOT NULL;
Pastikan untuk menjalankan ANALYZE table
setelah membuat index. (Autovacuum melakukannya secara otomatis setelah beberapa waktu jika Anda tidak melakukannya secara manual, tetapi jika Anda menguji segera setelah pembuatan, pengujian Anda akan gagal.)
Kemudian, untuk meyakinkan perencana kueri bahwa indeks parsial tertentu dapat digunakan, ulangi WHERE
kondisi dalam kueri - meskipun tampaknya sangat berlebihan:
SELECT col1,col2, .. colN
FROM table
WHERE text_col = 'my_value'
AND text_col IS NOT NULL; -- repeat condition
Voila.
Per dokumentasi:
Namun, perlu diingat bahwa predikat harus cocok dengan kondisi yang digunakan dalam kueri yang seharusnya mendapat manfaat dari indeks. Tepatnya, indeks parsial dapat digunakan dalam kueri hanya jika sistem dapat mengenali bahwa
WHERE
kondisi query secara matematis menyiratkan predikat indeks. PostgreSQL tidak memiliki pembuktian teorema canggih yang dapat mengenali ekspresi ekuivalen secara matematis yang ditulis dalam bentuk yang berbeda. (Tidak hanya pembuktian teorema umum seperti itu yang sangat sulit untuk dibuat, mungkin akan terlalu lambat untuk digunakan secara nyata.) Sistem dapat mengenali implikasi pertidaksamaan sederhana, misalnya "x <1" menyiratkan "x <2"; jika tidak, predikat kondisi harus sama persis dengan bagian dariWHERE
que kueri kondisi atau indeks tidak akan dikenali sebagai dapat digunakan. Pencocokan terjadi pada waktu perencanaan kueri, bukan pada waktu berjalan. Akibatnya, klausa kueri berparameter tidak berfungsi dengan indeks parsial.
Untuk kueri berparameter:sekali lagi, tambahkan predikat (berlebihan) dari indeks parsial sebagai tambahan, WHERE
kondisi, dan berfungsi dengan baik.
Pembaruan penting di Postgres 9.6 sangat meningkatkan peluang untuk pemindaian hanya indeks (yang dapat membuat kueri lebih murah dan perencana kueri akan lebih mudah memilih paket kueri tersebut). Terkait:
- PostgreSQL tidak menggunakan indeks selama hitungan(*)