Сканирование индекса не работает для json данных, установленных в postgres - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь понять, как извлечь данные из 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 хотя таблица проиндексирована с условием фильтра?

1 Ответ

0 голосов
/ 07 апреля 2020

В вашем примере запроса есть синтаксическая ошибка, несбалансированные паранетезы.

Если вы хотите посмотреть на индекс с двойной точностью, то именно так должен быть определен индекс.

CREATE INDEX ON mytable USING btree
    (((data -> 'info' ->> 'startTimeL')::double precision))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...