【问题标题】:Postgres index timestamp with timezone column带有时区列的 Postgres 索引时间戳
【发布时间】:2019-11-08 23:21:25
【问题描述】:

我正在运行 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. 是否有更好/更简洁的方式来指定开始和结束时间?

【问题讨论】:

    标签: postgresql indexing timestamp-with-timezone


    【解决方案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);
    

    与往常一样,我建议在评估索引时使用EXPLAINEXPLAIN ANALYZE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-27
      • 2018-01-18
      • 2020-04-07
      • 2023-03-21
      • 2020-09-19
      • 2021-02-08
      • 2019-11-20
      • 2022-11-22
      相关资源
      最近更新 更多