sql >> Database teknologi >  >> RDS >> PostgreSQL

Fremskynd rækkeviddetest for nøgleværdier indlejret i jsonb-array af objekter

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
   );

FINDER semi-join undgår duplikering af rækker i den mellemliggende tabel, når flere array-objekter matcher - og behovet for 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:



  1. Forbind online mysql-database med den lokale xampp-server ved hjælp af php

  2. SQL - optælling af rækker med specifik værdi

  3. Docker-billede køres i m1-processor

  4. bedste e-handelsvogne til Zend Framework-udvikler