En første umiddelbare foranstaltning ville være at gøre den forespørgsel, du har, en smule hurtigere:
SELECT *
FROM parents p
WHERE EXISTS (
SELECT FROM jsonb_array_elements(p.children) c
WHERE (c->>'age')::int BETWEEN 10 AND 12
);
DISTINCT ON
i den ydre forespørgsel. Men det er kun en smule hurtigere endnu.
Kerneproblemet er, at du vil teste for et interval af heltalsværdier , mens eksisterende jsonb
operatører
ikke giver en sådan funktionalitet.
Der er forskellige måder omkring dette. Uden at vide noget af dette, er her en "smart" løsning, der løser det givne eksempel. Tricket er at opdele området til forskellige værdier og bruge jsonb
indeslutningsoperatør @>
:
SELECT *
FROM parents p
WHERE (p.children @> '[{"age": 10}]'
OR p.children @> '[{"age": 11}]'
OR p.children @> '[{"age": 12}]');
Understøttet af en jsonb_path_ops
GIN-indeks:
CREATE INDEX parents_children_gin_idx ON parents USING gin (children jsonb_path_ops);
Men hvis dine intervaller spænder over mere end en hånd fuld af heltalsværdier, har du brug for noget mere generisk. Som altid , den bedste løsning afhænger af hele situationen:Datafordeling, værdifrekvenser, typiske intervaller i forespørgsler, NULL-værdier mulige?, rækkestørrelse, læse/skrivemønstre, gør hver jsonb
værdi har en eller flere matchende alder
nøgle? ...
Relateret svar med specialiseret, meget hurtigt indeks:
Relateret: