PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Indeks PostgreSQL w JSON

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 !




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja tworzenia PostgreSQL

  2. BŁĄD:odmowa zezwolenia dla sekwencji cities_id_seq przy użyciu Postgres

  3. isnumeric() z PostgreSQL

  4. Zgrupowane LIMIT w PostgreSQL:pokazać pierwsze N ​​wierszy dla każdej grupy?

  5. Błąd PostgreSQL:Relacja już istnieje