带时区列的 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;
...但我想知道两件事:
- 为我的场景索引
expiration
列的最佳方法是什么?
- 是否有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);
一如既往,我建议在评估索引时使用 EXPLAIN
和 EXPLAIN ANALYZE
。
我是 运行 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;
...但我想知道两件事:
- 为我的场景索引
expiration
列的最佳方法是什么? - 是否有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);
一如既往,我建议在评估索引时使用 EXPLAIN
和 EXPLAIN ANALYZE
。