Есть таблица в ней строки с массивами УНИКАЛЬНЫХ значений. Значения уникальны в пределах всей таблицы. Хочется найти строку в массиве которой есть искомое значение. Судя по приведенному ниже логу это получается вот только explain не радует говоря что фильтровал по условию и отбросил 2 строки.
Подскажите плиз как это все можно ускорить? Создать какой-то другой индекс применительно к json? В принципе я могу хешировать эти json и хранить не массив jsonb а массив text или bytea с хешем если это может помочь. Есть какие-то идеи?
postgres9.6=> create table xxx (x_list jsonb[]);
CREATE TABLE
postgres9.6=> insert into xxx (x_list) values (ARRAY['{ "a" : "78", "b" : "157" }'::jsonb,'{ "a" : "19", "b" : "25" }'::jsonb]);
INSERT 0 1
postgres9.6=> insert into xxx (x_list) values (ARRAY['{ "a" : "67", "b" : "51" }'::jsonb,'{ "a" : "124", "b" : "53" }'::jsonb]);
INSERT 0 1
postgres9.6=> insert into xxx (x_list) values (ARRAY['{ "a" : "14", "b" : "32" }'::jsonb,'{ "a" : "36", "b" : "5" }'::jsonb]);
INSERT 0 1
postgres9.6=> create unique index xxx_i1 ON xxx (x_list);
CREATE INDEX
postgres9.6=> vacuum full ANALYZE xxx;
VACUUM
postgres9.6=> set enable_seqscan = off;
SET
postgres9.6=> select * from xxx where x_list @> ARRAY['{ "a" : "124", "b" : "53" }'::jsonb];
x_list
----------------------------------------------------------------------
{"{\"a\": \"67\", \"b\": \"51\"}","{\"a\": \"124\", \"b\": \"53\"}"}
(1 строка)
postgres9.6=> explain analyze select * from xxx where x_list @> ARRAY['{ "a" : "124", "b" : "53" }'::jsonb];
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------
Index Only Scan using xxx_i1 on xxx (cost=0.13..12.18 rows=1 width=85) (actual time=0.025..0.027 rows=1 loops=1)
Filter: (x_list @> '{"{\"a\": \"124\", \"b\": \"53\"}"}'::jsonb[])
Rows Removed by Filter: 2
Heap Fetches: 3
Planning time: 0.085 ms
Execution time: 0.045 ms
(6 строк)