我的桌子上有很多插入物,将(uploaded_at
)字段之一设置为NULL
。然后,定期任务选择所有元组WHERE uploaded_at IS NULL
,对其进行处理并更新,将其设置uploaded_at
为当前日期。
我应该如何索引表?
我了解我应该使用部分索引,例如:
CREATE INDEX foo ON table (uploaded_at) WHERE uploaded_at IS NULL
或类似的东西。我有点困惑,但是如果对一个始终为的字段进行索引是正确的话NULL
。或者使用b树索引是否正确。哈希看起来是个更好的主意,但是它已经过时了,不能通过流热备份复制来复制。任何建议将不胜感激。
我已经尝试了以下索引:
"foo_part" btree (uploaded_at) WHERE uploaded_at IS NULL
"foo_part_id" btree (id) WHERE uploaded_at IS NULL
并且查询计划程序似乎总是选择foo_part
索引。explain analyse
也会为foo_part
索引产生更好的结果:
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
与
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
例如,可能是串行字段吗?