Отметка времени индекса Postgres со столбцом часового пояса

Я использую PostgreSQL 9.6, и у меня есть таблица с именем decks со столбцом expiration типа timestamp with time zone (для хранения колод карт, срок действия каждой карты может истечь независимо).

Я хотел бы создать ночное задание cron, которое находит все карты, срок действия которых истек в любой момент в течение предыдущего дня, т.е. с 0:00 до 23:59 включительно.

Это, кажется, дает мне диапазон времени, который я хочу...

SELECT id
  FROM decks
 WHERE expiration >= (now()::date - 1)::timestamptz
   AND expiration < (now()::date)::timestamptz;

... но меня интересуют две вещи:

  1. Как лучше всего проиндексировать столбец expiration для моего сценария?
  2. Есть ли лучший/более чистый способ указать время начала и окончания?

person Rob Johansen    schedule 27.06.2019    source источник


Ответы (1)


Вопрос 1. Для этого запроса лучше всего использовать стандартный индекс. Однако см. ниже.

Вопрос 2: Здесь много вариантов. Быстрое изменение вашего запроса:

SELECT id
  FROM decks
WHERE expiration::date = (now()::date - 1);

... позволяет вам создать функциональный индекс для expiration::date, который должен быть меньше и немного эффективнее.

Лично я бы пошел немного дальше и использовал current_date вместо now():

SELECT id
  FROM decks
WHERE expiration::date = (current_date - 1);

Как всегда, я рекомендую использовать EXPLAIN и EXPLAIN ANALYZE при оценке индексов.

person jmelesky    schedule 27.06.2019