Список докладов конференции PgConf.Russia 2017

Оптимизация запросов к данным типа “множество” с помощью индексов GIN, GiST, и пользовательских расширений для индексирования

Markus Nullmeier
University of Heidelberg, software developer

Markus Nullmeier имеет опыт работы в разнообразных сферах, таких как физика низких температур, обработка изображений, а также численное моделирование процессов горения, полимеризации и гидрогазодинамики. В настоящее время он занимается серверной частью астрономических баз данных на основе PostgreSQL в рамках альянса “Международная виртуальная обсерватория”. Основные сферы интересов в области PostgreSQL – пользовательские типы данных и их индексирование

Очевидно, что множества удобно использовать в различных типах приложений. Хотя в PostgreSQL и нет встроенного типа для множеств, до некоторой степени их можно смоделировать с помощью встроенных типов “массив” и “JSONB”. Кроме того, возможность ускорения запросов с операциями вхождения уже встроена в реализацию индексов GIN.

После краткого обзора существующей функциональности, мы рассмотрим, как добавление пользовательских типов “множество” и, в частности, модификация кода на С ("классы операторов") для индексов GIN и GiST, может повысить производительность. Затем мы продемонстрируем реализацию специализированного типа “множество”, в котором следующие друг за другом целые числа сжимаются с помощью группового кодирования (run-length encoding). На это решение нас вдохновил метод пространственной тесселяции, используемый в астрономии, где ни GIN, ни GiST не могут обеспечить эффективное индексирование. Начиная с версии PostgreSQL 9.6, вы можете добавлять в PostgreSQL свои собственные полноценные типы индексов как обычные расширения PostgeSQL.

RUM – одно из таких расширений, разработанное в компании Postgres Professional. Оно представялет собой усовершенствованную реализацию индексов GIN. Мы продемонстрируем свою модифицированную версию RUM – "OUZO". Используя особый способ обработки данных типа “ключ” (т.е. элементов множества), мы реализовали возможность группового кодирования для множеств. Это позволяет применить эффективные механизмы индексирования для сжатых множеств. Мы также обсудим такое свойство GIN, RUM, и (временно) OUZO, как запрет на удаление ключей, с точки зрения производительности в OUZO.

ВИДЕО

Слайды