Временная метка индекса Postgres с колонкой часовых поясов - PullRequest
0 голосов
/ 27 июня 2019

Я использую 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. Есть ли лучший / более чистый способ указать время начала и окончания?

1 Ответ

0 голосов
/ 27 июня 2019

Вопрос 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 при оценке индексов.

...