Индексация JSON-документов в Greenplum

Greenplum для разработчика и дата-инженера примеры курсы обучение, разработчик Greenplum, использование Greenplum, Школа Больших Данных Учебный Центр Коммерсант

Как Greenplum индексирует JSON-документы, что такое GIN-индекс в PostgreSQL, чем он отличается от B-дерева и хэш-таблицы, когда и как их использовать, а также почему поддерживается только индексация JSONB-полей.

Как Greenplum индексирует JSONB-документы

Поскольку Greenplum основана на PostgreSQL, она также поддерживает работу со сложными типами данных и может вести себя подобно документо-ориентированной СУБД, обрабатывая JSON-документы. Помимо текстового JSON, Greenplum может работать и с бинарной реализацией этого формата, т.е. JSONB. Помимо отличий этих форматов данных, о которых мы писали здесь, в Greenplum есть еще одна особенность работы с ними: индексировать можно только JSONB-поля.

Хотя считается, что индексировать поля таблиц в Greenplum нет необходимости, т.к. эта СУБД предназначена для работы с большими объемами данных и SQL-запросы имеют низкую селективность, возвращая много строк, иногда индексация может быть полезна. JSONB-поля поддерживают индексы GIN, B-Tree и хэш. GIN (Generalized Inverted Index) или обратный индекс работает с типами данных, значения которых не являются атомарными, а состоят из элементов. Индексируются не сами значения, а отдельные элементы, каждый из которых ссылается на те значения, в которых он встречается.

Элементы никогда не удаляются из GIN-индекса, хотя сами значения, которые их содержат, могут меняться. Но набор элементов статичен, что позволяет нескольким процессам одновременно работать с GIN-индексом. Обычно GIN-индекс используется для ускорения полнотекстового поиска, поиска ключей или пар ключ/значение, встречающихся в большом количестве JSONB-документов. Есть два класса GIN-операторов, имеющих разные возможности производительности и гибкости. По умолчанию для JSONB-документов GIN поддерживает запросы с операторами @>, ? и точка (.). Создать GIN-индекс с помощью этого класса операторов позволяет следующая команда:

CREATE INDEX idxgin ON api USING GIN (jdoc);

Нестандартный класс GIN-операторов jsonb_path_ops не поддерживает операторы существования ключа, но зато поддерживает операторы @>, @?и @@. Создать индекс с помощью этого класса операторов можно, используя команду

CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);

GIN-индексы также поддерживают операторы @?и @@, выполняющие сопоставление jsonpath. Класс операторов jsonb_path_ops поддерживает только запросы с @>операторами @?и @@. Но он работает намного быстрее по сравнению с классом операторов по умолчанию jsonb_ops, т.к. индекс jsonb_path_ops обычно намного меньше и имеет более высокую селективность, особенно когда запросы содержат ключи, которые часто встречаются в данных. Поэтому операции поиска

обычно выполняются лучше, чем при использовании класса операторов по умолчанию.

Техническое различие между операторами GIN-индекса jsonb_ops и jsonb_path_ops заключается в том, что jsonb_ops создает независимые элементы индекса для каждого ключа и значения в данных, а jsonb_path_ops создает элементы индекса только для каждого значения в данных. По сути, каждый элемент индекса jsonb_path_ops представляет собой хэш значения и ключа, ведущего к нему. Поэтому запрос, ищущий эту структуру, приведет к чрезвычайно специфичному поиску по индексу. С другой стороны, оператор jsonb_ops индекса создает несколько элементов индекса, представляющие ключ и значения по отдельности, чтобы выполнить запрос на поиск строк с этими элементами. Хотя GIN-индексы могут выполнять такой поиск довольно эффективно, он все равно будет менее конкретным и более медленным, чем эквивалентный поиск jsonb_path_ops, особенно если имеется очень большое количество строк, содержащих любой один из нескольких элементов индекса. Недостатком оператора jsonb_path_ops является то, что он не создает записей индекса для структур JSON, не содержащих никаких значений, например, {«key»: {}}. Если запрошен поиск документов, содержащих такую ​​структуру, потребуется полное сканирование индекса, что довольно медленно. Поэтому jsonb_path_ops не подходит для приложений, которые часто выполняют поиск по JSONB-документам, значения в которых могут отсутствовать при наличии ключа.

Greenplum также поддерживает такие структуры индексации JSONB-Документов, как сбалансированное дерево (B-Tree) и хэш-таблица. Обычно они полезны только тогда, когда важно проверить равенство полных JSON-документов. Ключи объектов сравниваются в порядке их хранения. Поскольку более короткие ключи сохраняются перед более длинными, это может привести к изменению их порядка. Впрочем, в отличие от JSON, формат JSONB в принципе не сохраняет порядок ключей объектов.

Чтобы работать с типом данных JSONB в хранимых процедурах, используются соответствующие дополнительные расширения, реализующие преобразования типа для разных процедурных языков. Например, для языка Perl есть расширения jsonb_plperl и jsonb_plperlu, которые обеспечивают сопоставление JSONB-значений с массивами Perl, хэшами и скалярами. Для Python расширение PL/Python называется jsonb_plpython3u. Оно сопоставляет JSONB-значения со словарями, списками и скалярами Python.

Помимо JSON- и JSONB-документов, Greenplum также поддерживает работу с XML, который является стандартным форматом сообщений в SOAP-сервисах. Об этом мы поговорим в следующий раз.

Научитесь использовать Greenplum с Arenadata DB для эффективного хранения и аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.

Источники

  1. https://docs.vmware.com/en/VMware-Greenplum/7/greenplum-database/admin_guide-query-topics-json-data.html
  2. https://habr.com/ru/companies/postgrespro/articles/340978/
Поиск по сайту