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)); |
|
|
|
|
|