Как создать индекс для поля postgresql jsonb (массив данных) и текстового поля

#postgresql

Вопрос:

Пожалуйста, дайте мне знать, как создать индекс для приведенного ниже запроса.

 SELECT * FROM customers
WHERE identifiers @>
      '[{"systemName": "SAP", "systemReference": "33557"}]'
  AND country_code = 'IN';
 

identifiers является типом jsonb, а данные, как показано ниже.

 [{"systemName": "ERP", "systemReference": "TEST"}, {"systemName": "FEED", "systemReference": "2733"}, {"systemName": "SAP", "systemReference": "33557"}]
 

country_code является типом varchar.

Ответ №1:

Либо создайте индекс ДЖИНА на identifiers ..

 CREATE INDEX customers_identifiers_idx ON customers 
USING GIN(identifiers);
 

.. или составной индекс с identifiers и country_code .

 CREATE INDEX customers_country_code_identifiers_idx ON customers 
USING GIN(identifiers,country_code gin_trgm_ops);
 

Второй вариант будет зависеть от распределения значений country_code .

ДЕМОНСТРАЦИЯ: db<>fiddle

Ответ №2:

Вы можете создать gin индекс для jsonb введенных столбцов Postgresql . gin индекс имеет встроенные классы операторов для обработки операторов jsonb. Узнайте больше об индексе джина здесь https://www.postgresql.org/docs/12/gin-intro.html

Для типов varchar индекс btree достаточно хорош.