У меня составной индекс по целому числу и столбцу даты. При анализе запроса индекс используется для значений больше 1. Но при сравнении со значением 1 индекс не используется.
Также при использовании отрицательного значения Postgres использует Растровое сканирование кучи .
Результаты выглядят следующим образом:
Индекс используется
explain analyze select * from journal where status = 2 and deletedat is null;
Index Scan using journal_status_idx on journal (cost=0.28..25.03 rows=9 width=1333) (actual time=0.008..0.008 rows=0 loops=1)
Index Cond: ((status = 2) AND (deletedat IS NULL))
Planning time: 0.153 ms
Execution time: 0.052 ms
Индекс не используется
explain analyze select * from journal where status = 1 and deletedat is null;
Seq Scan on journal (cost=0.00..154.71 rows=1957 width=1333) (actual time=0.012..2.654 rows=2034 loops=1)
Filter: ((deletedat IS NULL) AND (status = 1))
Rows Removed by Filter: 743
Planning time: 0.125 ms
Execution time: 4.714 ms
Растровое сканирование кучи
explain analyze select * from journal where status = -1 and deletedat is null;
Bitmap Heap Scan on journal (cost=5.72..133.52 rows=140 width=1333) (actual time=0.100..0.299 rows=146 loops=1)
Recheck Cond: ((status = '-1'::integer) AND (deletedat IS NULL))
Heap Blocks: exact=49
-> Bitmap Index Scan on journal_status_idx (cost=0.00..5.68 rows=140 width=0) (actual time=0.075..0.075 rows=146 loops=1)
Index Cond: ((status = '-1'::integer) AND (deletedat IS NULL))
Planning time: 0.000 ms
Execution time: 1.291 ms
У кого-нибудь есть идеи?