PostgreSQL:索引时间戳的日期部分

时间:2015-12-15 15:35:46

标签: postgresql date indexing

考虑下表:

       Column       |           Type           |
--------------------+--------------------------+
 id                 | bigint                   |
 creation_time      | timestamp with time zone |
...

以下的查询(更不用说更复杂的JOIN)需要相当长的时间,因为他们需要计算每个项目的creation_time :: DATE:

SELECT creation_time::DATE, COUNT(*) FROM items GROUP BY 1;

如何在时间戳的当天部分创建索引 - creation_time::DATE

我试过了:

  • CREATE INDEX items_day_of_creation_idx ON items (creation_time)::date;
  • CREATE INDEX items_day_of_creation_idx ON items (creation_time::date);

但都失败了:

ERROR:  syntax error at or near "::"

2 个答案:

答案 0 :(得分:7)

在表达式上创建索引时,必须在括号之间放置表达式(除了围绕列/表达式列表的括号外:

CREATE INDEX items_day_of_creation_idx ON items ( (creation_time::date) );

答案 1 :(得分:0)

这行得通,但是我注意到使用表达式将时间戳转换为日期的索引比时间戳上的索引占用更多的磁盘空间(〜15%-20%)。

我希望减少磁盘空间,以便在8字节时间戳上的4字节日期上建立索引,但事实并非如此,因为8字节似乎是索引中元素的最低公分母。因此,磁盘使用情况更糟,查询性能大致相同,因此我放弃了这种方法。