В PostgreSQL у меня есть индекс поля даты в моей таблице tickets
. Когда я сравниваю поле с now()
, запрос довольно эффективен:
# explain analyze select count(1) as count from tickets where updated_at > now();
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=90.64..90.66 rows=1 width=0) (actual time=33.238..33.238 rows=1 loops=1)
-> Index Scan using tickets_updated_at_idx on tickets (cost=0.01..90.27 rows=74 width=0) (actual time=0.016..29.318 rows=40250 loops=1)
Index Cond: (updated_at > now())
Total runtime: 33.271 ms
Он идет вниз и использует сканирование кучи растровых изображений, если я пытаюсь сравнить его с now()
минус интервал.
# explain analyze select count(1) as count from tickets where updated_at > (now() - '24 hours'::interval);
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=180450.15..180450.17 rows=1 width=0) (actual time=543.898..543.898 rows=1 loops=1)
-> Bitmap Heap Scan on tickets (cost=21296.43..175963.31 rows=897368 width=0) (actual time=251.700..457.916 rows=924373 loops=1)
Recheck Cond: (updated_at > (now() - '24:00:00'::interval))
-> Bitmap Index Scan on tickets_updated_at_idx (cost=0.00..20847.74 rows=897368 width=0) (actual time=238.799..238.799 rows=924699 loops=1)
Index Cond: (updated_at > (now() - '24:00:00'::interval))
Total runtime: 543.952 ms
Есть ли более эффективный способ запроса с использованием арифметики даты?
select version()
. Опубликуйте схему таблицы\d tickets
- person Clodoaldo Neto   schedule 15.07.2014ANALYZE
стол? Кстати, первый запрос использует только сканирование индекса, в то время как второй обрабатывает гораздо больше записей и должен сканировать саму таблицу. - person Ihor Romanchenko   schedule 15.07.2014now()
иnow() - '24 hours'::interval
соответствующими литералами меток времени, и вы получите тот же результат. Важно ожидаемое количество найденных строк (74 против 897368). Как объяснено в моем ответе. - person Erwin Brandstetter   schedule 15.07.2014