explain analyze
показывает, что postgres будет использовать сканирование индекса для моего запроса, который извлекает строки и выполняет фильтрацию по дате (т. е. 2017-04-14 05:27:51.039
):
explain analyze select * from tbl t where updated > '2017-04-14 05:27:51.039';
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
Index Scan using updated on tbl t (cost=0.43..7317.12 rows=10418 width=93) (actual time=0.011..0.515 rows=1179 loops=1)
Index Cond: (updated > '2017-04-14 05:27:51.039'::timestamp without time zone)
Planning time: 0.102 ms
Execution time: 0.720 ms
однако выполнение того же запроса, но с другим фильтром даты '2016-04-14 05:27:51.039' показывает, что вместо этого postgres будет выполнять запрос с использованием последовательного сканирования:
explain analyze select * from tbl t where updated > '2016-04-14 05:27:51.039';
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Seq Scan on tbl t (cost=0.00..176103.94 rows=5936959 width=93) (actual time=0.008..2005.455 rows=5871963 loops=1)
Filter: (updated > '2016-04-14 05:27:51.039'::timestamp without time zone)
Rows Removed by Filter: 947
Planning time: 0.100 ms
Execution time: 2910.086 ms
Как postgres решает, что использовать, особенно при фильтрации по дате?