PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL индекс на JSON

Другите ви два индекса няма да работят просто защото ->> операторът връща text , докато очевидно имате jsonb gin оператор класове в ума. Имайте предвид, че споменавате само json , но всъщност се нуждаете от jsonb за разширени възможности за индексиране.

За да изработите най-добрата стратегия за индексиране, ще трябва да дефинирате по-отблизо кои заявки да покриете. Интересувате ли се само от крави? Или всички животни / всички етикети? Кои оператори са възможни? Вашият JSON документ включва ли и неживотински ключове? Какво да правя с тези? Искате ли да включите редове в индекса, където кравите (или каквото и да е друго) изобщо не се показват в документа JSON?

Да приемем:

  • Интересуваме се само от крави на първо ниво на гнездене.
  • Стойността винаги е валидно integer .
  • Не се интересуваме от редове без крави.

Предлагам функционален btree индекс, подобно на това, което вече имате, но прехвърляне на стойността към integer . Не предполагам, че бихте искали сравнението да се оценява като text (където „2“ е по-голямо от „1111“).

CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int));  -- !

Допълнителният набор от скоби е необходим за преобразуването, за да направи синтаксиса на индексния израз недвусмислен.

Използвайте същия израз във вашите заявки, за да накарате Postgres да разбере, че индексът е приложим:

SELECT * FROM farm WHERE (animal ->> 'cow')::int > 3;

Ако имате нужда от по-общ jsonb индекс, помислете за:

  • Какъв е правилният индекс за запитване на структури в масиви в Postgres jsonb?

За известен, статичен, тривиален брой животни (както коментирахте), предлагам частични индекси като:

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;

И т.н.

Може да се наложи да добавите условието за индекс към заявката:

SELECT * FROM farm
WHERE (animal ->> 'cow')::int > 3
AND   (animal ->> 'cow') IS NOT NULL; 

Може да изглежда излишно, но може да е необходимо. Тествайте с 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. Как да изброите таблици, засегнати от каскадно изтриване

  2. Името на колоната PL/pgSQL е същото като променливата

  3. Надстройте PostgreSQL JSON колоната до JSONB?

  4. Използване на pg_dump за получаване само на изрази за вмъкване от една таблица в базата данни

  5. Предизвикателства при мащабиране на базата данни Moodle PostgreSQL