回答

收藏

PostgreSQL:在timestamp :: DATE创建一个索引

技术问答 技术问答 218 人阅读 | 0 人回复 | 2023-09-14

这个问题有答案    :( ~  t: m" j. W8 b
PostgreSQL:索引时间戳的一天部分 (2个答案)
* B7 V* |2 ^' {4 y9 v. r3 i* Y5年前关闭。
9 w( u4 @+ i7 R# u6 Z. ^我正在创建一个的所有事件创建一个汇总表。
, ~1 i- O$ V; i9 m, G2 wINSERT INTO graph_6(  day, event_type, (SELECT COUNT(*) FROM event e                   WHERE event_type = e.event_type                   AND creation_time:ATE = sq.day)FROM event_typeCROSS JOIN    (SELECT generate_series(               (SELECT '2014-01-01':ATE),               (SELECT '2014-01-02':ATE),       day') as day) sq;该creation_time已建立索引列:; ~* b9 w6 f% j) ]+ n
CREATE INDEX event_creation_time_date_idx ON event USING BTREE(creation_time);但即使只查询两天的数据和少数事件,查询也会持续很长时间(2014年1月1日)-2日)。
6 ?  ]& s9 k5 t& r2 [" I% P6 }# n; P在EXPLAIN查询相当严重-它运行顺序扫描event表,而不是使用指数:5 n4 G+ `4 R9 m& j& y2 U: E. ^9 W
->  Seq Scan on event e_1  (cost=0.00..12557.39 rows=531 width=38)Filter: ... AND ((creation_time)::date = (generate_series(($12)::timestamp with time zone,($13)::timestamp with time zone,'1 day'::interval))))我认为这是因为我们比较了强制转换值-creation_time:ATE而不是creation_time。我试着索引演员表:8 M0 G: T  o( p, e4 o( k
CREATE INDEX event_creation_time_date_idx ON event USING BTREE(creation_time:ATE);但有一个错误:
% T& A) i7 Q- O1 l! w$ Q3 u" ZERROR: syntax error at or near "::"有没有办法将其转换为DATE的时区列上利用PostgreSQL索引?6 l! \( j7 A/ d, L! N
                                                                3 m& ?  ~6 x" B5 h: ]6 u
    解决方案:                                                                / i4 b* M5 o8 a* N
                                                                索引声明中的表达式应放在其他方括号中,请尝试:
5 q( f2 m$ {& x" {9 k/ r0 a- hCREATE INDEX event_creation_time_date_idx ON event ((creation_time:ATE));
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则