0

我试图了解从具有某些过滤条件的JSON文件中提取数据。PostgreSQL

这是我的查询,

创建如下索引,

CREATE INDEX idx_startTimeL_n
    ON mytable USING btree
    (((data -> 'info'::text) ->> 'startTimeL'::text) ) 

如果我运行解释选择查询

EXPLAIN   SELECT * FROM mytable
      WHERE (((data -> 'info'::text) ->> 'startTimeL'::text)::double precision) <= (date_part('epoch'::text, now()) * 1000::double precision)
      AND ((data -> 'info'::text) ->> 'startTimeL'::text)::double precision) >= (date_part('epoch'::text, now()) * 1000::double precision - 3600000::double precision)
     LIMIT 400000;

查询规划器的结果是,

"Limit  (cost=0.00..36371.90 rows=220700 width=1568)"
"  ->  Seq Scan on mytable  (cost=0.00..36371.90 rows=220700 width=1568)"
"        Filter: (((((data -> 'info'::text) ->> 'startTimeL'::text))::double precision <= (date_part('epoch'::text, now()) * '1000'::double precision)) AND ((((data -> 'info'::text) ->> 'startTimeL'::text))::double precision >= ((date_part('epoch'::text, now()) * '1000'::double precision) - '3600000'::double precision)))"

所以,这里我的问题是为什么会seq scan发生而不是index scan即使表索引了过滤条件?

4

1 回答 1

0

您的示例查询有语法错误,括号不平衡。

如果您想查找具有双精度的索引,那么这就是必须定义索引的方式。

CREATE INDEX ON mytable USING btree
    (((data -> 'info' ->> 'startTimeL')::double precision))
于 2020-04-06T22:19:08.177 回答