Стартап OrioleData опубликовал новый движок хранения для СУБД PostgreSQL - OrioleDB, нацеленный на предоставление быстрого и компактного хранилища, не приводящего со временем к раздутию файлов с БД и не требующего использования периодически запускаемого процесса VACUUM для сборки мусора. Движок написан на языке Си, распространяется под лицензией PostgreSQL и реализован в форме подключаемого расширения, требующего внесения изменений в основную кодовую базу PostgreSQL. В текущем виде движок находится на стадии бета-тестирования и пока не рекомендован для рабочих внедрений.
Применяемые в OrioleDB структуры позволяют более эффективно обрабатывать операции изменения данных в БД и заменять освободившиеся блоки, не накапливая их со временем. Возможность обходиться без VACUUM реализована благодаря применению логов отката (undo logs), работающих на уровне отдельных блоков и строк, а также системы автоматического слияния страниц с данными.
Работающий на уровне строк лог отката позволяет выполнять операции UPDATE с заменой данных по месту, без освобождения текущей записи и создания новой. Лог отката на уровне блоков даёт возможность вытеснять кортежи и высвобождать место в хранилище сразу после выполнения операции DELETE, невзирая на то, что они остаются видимыми в незавершившихся транзакциях. Для сокращения фрагментации хранилища в результате большого числа операций удаления в фоновом режиме выполняется автоматическое слияние отдельных страниц с данными.
WAL-лог транзакций в OrioleDB ведётся на уровне строк, а не блоков, что упрощает использование в распределённых системах и позволяет распараллеливать раскрутку лога. Возможно создание распределённых конфигураций с несколькими активными master-серверами, для поддержания которых в синхронизированном состоянии используется алгоритм достижения консенсуса Raft.
Из архитектурных особенностей OrioleDB также можно отметить чтение страниц с данными без использования блокировок, прямое связывание страниц в оперативной памяти со страницами в постоянном хранилище, применение механизма CoW (copy-on-write) при фиксации контрольных точек для создания непротиворечивых снапшотов в любой момент времени. Для идентификаторов транзакций задействованы 64-разрядные значения, применение которых решает проблему с переполнением счётчиков.
Применение OrioleDB позволяет не только избавиться от необходимости совершения ручных операций и упростить сопровождение СУБД, но и повысить производительность. Например, более высокая производительность достигается благодаря обновлению данных по месту, что позволяет обойтись без изменения индексов, не связанных с хранением изменённого значения. Движок также поддерживает хранение данных в сжатом виде (сжатие производится при помощи алгоритма ZSTD и реализовано на уровне блоков переменного размера), что позволяет в 4-5 раз сократить размер базы на диске.
Тестирование конфигурации из одной таблицы с 5 индексами при использовании OrioleDB показало увеличение TPS (число обрабатываемых транзакций в секунду) в 5 раз, снижение нагрузки на CPU в 2.3 раза, снижение числа операций ввода/вывода на каждую транзакцию в 22 раза и отсутствие раздувания размера индексов и таблиц.