У меня есть таблица с большим количеством вставок, установив одно из полей ( 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
поле, например?serial
так же хорош, как и любой. Дело в том, есть ли на самом деле запросы, чтобы использовать его.