Twoje dwa pozostałe indeksy nie będą działać tylko dlatego, że ->>
operator zwraca text
, podczas gdy oczywiście masz jsonb
pamiętaj o klasach operatorów ginu. Zauważ, że wspominasz tylko json
, ale tak naprawdę potrzebujesz jsonb
dla zaawansowanych możliwości indeksowania.
Aby wypracować najlepszą strategię indeksowania, musisz dokładniej zdefiniować zapytania do pokrycia. Czy interesują Cię tylko krowy? Czy wszystkie zwierzęta / wszystkie tagi? Którzy operatorzy są możliwi? Czy Twój dokument JSON zawiera również klucze niezwierzęce? Co z nimi zrobić? Czy chcesz uwzględnić w indeksie wiersze, w których krowy (lub cokolwiek) w ogóle nie pojawiają się w dokumencie JSON?
Zakładając:
- Interesują nas tylko krowy na pierwszym poziomie gniazdowania.
- Wartość jest zawsze prawidłową
integer
. - Nie interesują nas rzędy bez krów.
Proponuję funkcjonalny indeks btree, podobny do tego, który już masz, ale rzutuj wartość na integer
. Przypuszczam, że nie chcesz, aby porównanie było oceniane jako text
(gdzie „2” jest większe niż „1111”).
CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int)); -- !
Dodatkowy zestaw nawiasów jest wymagany dla skrótu rzutowania, aby składnia wyrażenia indeksu była jednoznaczna.
Użyj tego samego wyrażenia w swoich zapytaniach, aby Postgres zdał sobie sprawę, że indeks ma zastosowanie:
SELECT * FROM farm WHERE (animal ->> 'cow')::int > 3;
Jeśli potrzebujesz bardziej ogólnego jsonb
indeks, rozważ:
- Jaki jest właściwy indeks do odpytywania struktur w tablicach w jsonb Postgresa?
Dla znanego, statycznego, trywialnego liczba zwierząt (tak jak skomentowałeś), proponuję częściowe indeksy takie jak:
CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int))
WHERE (animal ->> 'cow') IS NOT NULL;
CREATE INDEX animal_index ON farm (((animal ->> 'chicken')::int))
WHERE (animal ->> 'chicken') IS NOT NULL;
Itd.
Może być konieczne dodanie warunku indeksu do zapytania:
SELECT * FROM farm
WHERE (animal ->> 'cow')::int > 3
AND (animal ->> 'cow') IS NOT NULL;
Może wydawać się zbędne, ale może być konieczne. Przetestuj za pomocą ANALYZE
!