带时区列的 Postgres 索引时间戳

Postgres index timestamp with timezone column

我是 运行 PostgreSQL 9.6,我有一个名为 decks 的 table 和一个 timestamp with time zone 类型的 expiration 列(用于存储牌组每张卡都可以独立过期的卡数)。

我想创建一个每晚的 cron 作业来查找在前一天的任何时候过期的所有卡片——即在 0:00 和 23:59 之间(含)。

这似乎给了我想要的时间范围...

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

...但我想知道两件事:

  1. 为我的场景索引 expiration 列的最佳方法是什么?
  2. 是否有better/cleaner指定开始和结束时间的方法?

问题 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);

一如既往,我建议在评估索引时使用 EXPLAINEXPLAIN ANALYZE