Saya punya tabel dengan banyak sisipan, mengatur salah satu bidang ( uploaded_at
) ke NULL
. Kemudian tugas berkala memilih semua tupel WHERE uploaded_at IS NULL
, memprosesnya dan memperbarui, mengatur uploaded_at
ke tanggal saat ini.
Bagaimana saya harus mengindeks tabel?
Saya mengerti bahwa saya harus menggunakan indeks parsial seperti:
CREATE INDEX foo ON table (uploaded_at) WHERE uploaded_at IS NULL
Atau pertanda seperti itu. Saya agak bingung meskipun apakah itu benar untuk mengindeks pada bidang yang selalu NULL
. Atau jika benar menggunakan indeks b-tree. Hash terlihat seperti ide yang lebih baik, tetapi sudah usang dan tidak direplikasi melalui streaming replikasi hot-standby. Saran apa pun akan sangat dihargai.
Saya telah bereksperimen sedikit dengan indeks berikut:
"foo_part" btree (uploaded_at) WHERE uploaded_at IS NULL
"foo_part_id" btree (id) WHERE uploaded_at IS NULL
dan perencana kueri tampaknya selalu memilih foo_part
indeks. explain analyse
juga menghasilkan hasil yang sedikit lebih baik untuk foo_part
indeks:
Index Scan using foo_part on t1 (cost=0.28..297.25 rows=4433 width=16) (actual time=0.025..3.649 rows=4351 loops=1)
Index Cond: (uploaded_at IS NULL)
Total runtime: 4.060 ms
vs.
Bitmap Heap Scan on t1 (cost=79.15..6722.83 rows=4433 width=16) (actual time=1.032..4.717 rows=4351 loops=1)
Recheck Cond: (uploaded_at IS NULL)
-> Bitmap Index Scan on foo_part_id (cost=0.00..78.04 rows=4433 width=0) (actual time=0.649..0.649 rows=4351 loops=1)
Total runtime: 5.131 ms
sumber
id
bidang serial misalnya?serial
sebagus apapun. Intinya adalah apakah sebenarnya ada pertanyaan untuk memanfaatkannya.