-
Indeks biasanya tidak berguna untuk operasi pada 90% dari semua baris. Pemindaian berurutan akan lebih cepat. (Pengecualian eksotis berlaku.)
-
Jika Anda perlu mengizinkan pembacaan bersamaan, Anda tidak dapat mengambil kunci eksklusif di atas meja. Jadi Anda juga tidak dapat menjatuhkan indeks apa pun dalam transaksi yang sama.
-
Anda bisa jatuhkan indeks dalam transaksi terpisah untuk meminimalkan durasi penguncian eksklusif. Di Postgres 9.2 atau yang lebih baru, Anda juga dapat menggunakan LEPASKAN INDEKS SECARA SAAT , yang hanya membutuhkan kunci minimal. Nanti gunakan
CREATE INDEX CONCURRENTLY
untuk membangun kembali indeks di latar belakang - dan hanya mengambil kunci eksklusif yang sangat singkat.
Jika Anda memiliki kondisi stabil untuk mengidentifikasi 10% (atau kurang) dari baris yang tersisa, saya akan menyarankan indeks parsial hanya pada baris tersebut untuk mendapatkan yang terbaik untuk keduanya:
- Membaca kueri dapat mengakses tabel dengan cepat (menggunakan indeks parsial) setiap saat.
- Yang besar
DELETE
tidak akan mengubah indeks parsial sama sekali, karena tidak ada baris yang terlibat dalamDELETE
.
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;
Dengan asumsi delete_flag
adalah boolean
. Anda harus menyertakan predikat yang sama dalam kueri Anda (meskipun tampaknya secara logis berlebihan) untuk memastikan Postgres dapat mengindeks sebagian.