Eu tenho uma tabela com muitas inserções, definindo um dos campos ( uploaded_at
) para NULL
. Em seguida, uma tarefa periódica seleciona todas as tuplas WHERE uploaded_at IS NULL
, as processa e atualiza, definindo uploaded_at
a data atual.
Como devo indexar a tabela?
Entendo que devo usar um índice parcial como:
CREATE INDEX foo ON table (uploaded_at) WHERE uploaded_at IS NULL
Ou algo assim. Estou um pouco confuso, porém, se é correto indexar em um campo que é sempre NULL
. Ou se é correto usar um índice de árvore b. O hash parece uma idéia melhor, mas é obsoleto e não é replicado por meio da replicação de hot-standby de streaming. Qualquer conselho seria muito apreciado.
Eu experimentei um pouco com os seguintes índices:
"foo_part" btree (uploaded_at) WHERE uploaded_at IS NULL
"foo_part_id" btree (id) WHERE uploaded_at IS NULL
e o planejador de consultas parece sempre escolher o foo_part
índice. explain analyse
também produz um resultado um pouco melhor para o foo_part
índice:
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 serial , por exemplo?