Robię takie zapytanie w PostgreSQL:
EXPLAIN ANALYZE SELECT "k3_allegro_api_offer_prop".* FROM "k3_allegro_api_offer_prop" WHERE jsonb_contains("k3_allegro_api_offer_prop"."offer_publication", '{"status":"ACTIVE"}')
co jest równoznaczne z:
SELECT "k3_allegro_api_offer_prop".* FROM "k3_allegro_api_offer_prop" WHERE "k3_allegro_api_offer_prop"."offer_publication" @> '{"status":"ACTIVE"}'
Dostaję:
Seq Scan on k3_allegro_api_offer_prop (cost=0.00..1.04 rows=1 width=57) (actual time=0.018..0.022 rows=3 loops=1)
Filter: jsonb_contains(offer_publication, '{"status": "ACTIVE"}'::jsonb)
Jak widać, szukanie jest sekwencyjne nie po indeksie.
Pytanie: czy w ogóle można zrobić w PostgreSQLu indeks na taką operację @>, ponieważ indeks typu GIN nie działa dla operatorów ? ?& ?| @>, działa tylko na operatorach typu -> czyli liczbowych.
Robienie innego typu indeksu nic nie daje, próbowałem np.:
create index k3_allegro_api_offer_prop_pub_active on k3_allegro_api_offer_prop ( ( JSONB_CONTAINS(offer_publication, '{"status":"ACTIVE"}') ) );
create index k3_allegro_api_offer_prop_pub_active on k3_allegro_api_offer_prop ( ( JSONB_CONTAINS(offer_publication, '{"status":"ACTIVE"}')::boolean ) );
i nie korzysta z tych indeksów.
Oczywiście, mógłbym to zapisywac jakoś liczbowo zamiast tekstowo "ACTIVE", i pewnie tak ostatecznie zrobię, tylko się zastanawiam, czy dałoby się dla operatora @> zrobić indeks czy się nie da.... jestem trochę noobem jeżeli chodzi o jsonb w PostgreSQL...