Индекс по вложенному полю JSONB не используется - PullRequest
0 голосов
/ 12 сентября 2018

Я создал индекс для вложенного поля JSONB:

CREATE INDEX foo_idx ON some_table(cast(content->'meta'->>'version' AS int));

но запрос на выборку по-прежнему выполняет полное сканирование таблицы:

select * 
from some_table 
where (content->'meta'->>'version')::INT <= 9000 
LIMIT 1;

Я также пытался выразить запрос как:

select * 
from some_table 
where cast(content->'meta'->>'version' AS INT) <= 9000 
LIMIT 1;

с тем же результатом.

План запроса:

Limit  (cost=0.00..1.06 rows=10 width=52)
  ->  Seq Scan on some_table  (cost=0.00..38429.27 rows=361441 width=52)
        Filter: ((((content -> 'meta'::text) ->> 'version'::text))::integer <= 9000)

Что мне здесь не хватает?

Редактировать: Это было скорее совпадение. Я добавил ORDER BY random() к запросу и получил следующий план запроса:

Limit  (cost=31644.83..31644.83 rows=1 width=52) (actual time=0.017..0.017 rows=0 loops=1)
  ->  Sort  (cost=31644.83..32548.43 rows=361441 width=52) (actual time=0.016..0.016 rows=0 loops=1)
        Sort Key: (random())
        Sort Method: quicksort  Memory: 25kB
        ->  Bitmap Heap Scan on game_object_user  (cost=6769.60..29837.62 rows=361441 width=52) (actual time=0.011..0.011 rows=0 loops=1)
              Recheck Cond: ((((content -> 'meta'::text) ->> 'version'::text))::integer < 9000)
              ->  Bitmap Index Scan on foo_idx  (cost=0.00..6679.23 rows=361441 width=0) (actual time=0.009..0.009 rows=0 loops=1)
                    Index Cond: ((((content -> 'meta'::text) ->> 'version'::text))::integer < 90000)
Planning time: 0.074 ms
Execution time: 0.040 ms

Был использован индекс.

...