Как 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 обычно намного меньше и имеет более высокую селективность, особенно когда запросы содержат ключи, которые часто встречаются в данных. Поэтому операции поиска Greenplum для инженеров данных и аналитиков данных
Код курса
GPDE
Ближайшая дата курса
Продолжительность
24 ак.часов
Стоимость обучения
72 000 руб.
обычно выполняются лучше, чем при использовании класса операторов по умолчанию.
Техническое различие между операторами 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 в Москве:
Источники