带时区列的Postgres索引时间戳

时间:2019-06-27 00:36:57

标签: postgresql indexing timestamp-with-timezone

我正在运行PostgreSQL 9.6,并且我有一个名为decks的表,该表的类型为expiration的{​​{1}}列(用于存储卡组,其中每张卡可以独立到期)。

我想创建一个每晚的Cron作业,以查找在前一天的任何时候(即在0:00和23:59(含)之间。

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

timestamp with time zone

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

  1. 为我的方案索引SELECT id FROM decks WHERE expiration >= (now()::date - 1)::timestamptz AND expiration < (now()::date)::timestamptz; 列的最佳方法是什么?
  2. 是否有更好/更干净的方法来指定开始时间和结束时间?

1 个答案:

答案 0 :(得分:0)

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