Ho una tabella con molti inserti, impostando uno dei campi ( uploaded_at
) su NULL
. Quindi un'attività periodica seleziona tutte le tuple WHERE uploaded_at IS NULL
, le elabora e aggiorna, impostando la uploaded_at
data corrente.
Come devo indicizzare la tabella?
Capisco che dovrei usare un indice parziale come:
CREATE INDEX foo ON table (uploaded_at) WHERE uploaded_at IS NULL
O smth così. Sono un po 'confuso, però, se è corretto indicizzare su un campo che è sempre NULL
. O se è corretto usare un indice b-tree. L'hash sembra un'idea migliore, ma è obsoleta e non viene replicata tramite la replica in streaming hot-standby. Qualsiasi consiglio sarebbe molto apprezzato.
Ho sperimentato un po 'con i seguenti indici:
"foo_part" btree (uploaded_at) WHERE uploaded_at IS NULL
"foo_part_id" btree (id) WHERE uploaded_at IS NULL
e la query planer sembra scegliere sempre l' foo_part
indice. explain analyse
produce anche risultati leggermente migliori per l' foo_part
indice:
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
id
campo seriale per esempio?