The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Разработчики OrioleDB предложили улучшить API для альтернативных движков PostgreSQL

31.03.2025 20:14

Разработчики OrioleDB проанализировали текущее состояние низкоуровневого API, применяемого для доступа расширений к таблицам и индексам в PostgreSQL (Table/Index Access Method (AM) API), и предложили пути его улучшения. С момента появления в PostgreSQL 12 подобного API разработчики получили возможность создавать альтернативные механизмы хранения данных. Однако, несмотря на наличие этого API и известные ограничения встроенного механизма хранения, до сих пор не появилось полнофункциональных транзакционных движков хранения, реализованных исключительно в виде расширений.

Наиболее востребованными функциями для альтернативных табличных движков PostgreSQL являются:

  • Альтернативные реализации MVCC, например, хранилища на основе журнала UNDO.
  • Индексно-организованные таблицы, где индекс не является необязательным дополнением к таблице, которое ускоряет запросы, а представляет собой основную структуру данных, в которой хранятся данные таблицы.

Изменения, необходимые в API Table/Index AM для поддержки альтернативных реализаций MVCC, рассматриваются с оглядкой на расширение OrioleDB, разработанное для устранения известных недостатков встроенного механизма хранения PostgreSQL. Проблема в том, что для полной интеграции OrioleDB с PostgreSQL требуются внесение изменений в код PostgreSQL, что усложняет внедрение проекта и подчёркивает необходимость модернизации текущего API Table AM.

API Table AM не навязывает напрямую способ реализации MVCC. Тем не менее, API Table AM и API Index AM делают следующее предположение: каждый TID (Tuple/row Identifier) либо индексируется всеми индексами, либо не индексируется вообще. Даже если Index AM имеет несколько ссылок на один TID (например, GIN), все эти ссылки должны соответствовать одному и тому же индексированному значению.

Этот принцип критиковали за увеличение числа операций записи ("write amplification") - если обновляется один индексированный атрибут, необходимо обновить каждый индекс в таблице. При необходимости в полной мере использовать преимущества журнала UNDO или построить другой метод хранения без "усиления записи" (например, метод WARM), требуется нарушить это предположение.

Table AM основанный на UNDO, который не будет нарушать это предположение, напоминает существующий метод HOT (Heap-Only Tuples), за исключением того, что старые версии строк сохраняются в журнале UNDO и не должны умещаться в той же странице. Но, по мнению авторов, этого преимущества недостаточно, чтобы оправдать существование отдельного Table AM.

Практические ограничения существующего API:

  • Во время обновления строки таблицы индексы обновляются по принципу «все или ничего».
  • Отсутствие в API Index AM возможности точечного удаления определённых кортежей. В настоящее время можно удалять кортежи из индексов массово с помощью методов ambulkdelete и amvacuumcleanup. Попытка реализовать точечное удаление через этот API привела бы к низкой эффективности, поскольку большинство текущих реализаций должны сканировать весь индекс. Кроме того, API не позволяет указать какие из кортежей, ссылающиеся на один и тот же TID, следует удалить. Он может удалить только их все.
  • Индексы в настоящее время ссылаются на строки таблицы по номеру блока (32 бита) и номеру смещения (16 бит). И только 11 бит номера смещения можно безопасно передать из TID таблицы во все методы доступа индекса. При этом альтернативным реализациям MVCC может потребоваться хранить дополнительную полезную нагрузку (payload) вместе с TID. Например, в OrioleDB требуется один или несколько бит для реализации индексов "delete-marking" или полной информации о видимости.

Предложено два способа преодолеть ограничения на практике:

    Подход 1: API Index AM предоставляет возможности для альтернативной реализации MVCC.

    В то время как Table AM продолжает отвечать за все компоненты MVCC, Index AM предоставляет необходимые возможности для альтернативной реализации MVCC, а именно: хранение пользовательской полезной нагрузки (payload) вместе с TID, метод точечного удаления и даже метод точечного обновления (если TID в индексе не может быть изменён, пользовательская полезная нагрузка – может). Кроме этого, так как необходимо разрешить нескольким кортежам индекса ссылаться на один и тот же TID, методы API, применяемые при сканировании индекса, также нуждаются в обновлении.

    Подход 2: Индексы, поддерживающие MVCC.

    Альтернативой было бы разрешить индексы, поддерживающие MVCC. То есть "executor" (или, возможно, Table AM) просто вызывает методы insert() и delete() в Index AM, в то время как Index AM предоставляет возможность сканирования c учётом MVCC. Это значительно упростило бы сканирование с использованием только индексов (index-only). Даже весь Table AM в таком случае мог бы стать промежуточным слоем, хранящим данные в индексе.

    На диаграмме ниже приведён пример. Значение индекса 2 обновляется транзакцией 11 со значения "A" на значение "B". Поэтому значение "A" отмечено как xmax == 11, а значение "B" отмечено как xmin == 11. Таким образом можно сканировать индекс 2 и получать только видимые кортежи в соответствии с MVCC без проверок кучи (heap). Сборка мусора индекса 2 также может быть выполнена без использования кучи.

    При внедрении всех перечисленных новшеств в API индексных методов доступа, маловероятно, чтобы удалось одновременно доработать все индексы для поддержки всех новых возможностей. Более реалистично разрешить несколько реализаций для одного индексного метода доступа. Например, в дополнение к обычному B-tree, расширение сможет реализовать альтернативный B-tree с поддержкой MVCC внутри индекса и поддержкой идентификаторов записи произвольной длины.

    Таким образом, предлагается пересмотреть не только API Table AM, но и API Index AM, который исправно служил сообществу PostgreSQL на протяжении многих лет. Более того, предлагается разделить Index AM на логический слой и слой реализации. Эта переосмысленная архитектура позволит PostgreSQL поддерживать различные модели хранения.

  1. Главная ссылка к новости (https://www.orioledb.com/blog/...)
  2. OpenNews: Седьмая бета-версия OrioleDB, высокопроизводительного движка хранения для PostgreSQL
  3. OpenNews: Для PostgreSQL представлен движок хранения OrioleDB, обходящийся без операции VACUUM
  4. OpenNews: Доступны IvorySQL 4.0 и SynchDB 1.0, надстройки к PostgreSQL для взаимодействия с другими СУБД
  5. OpenNews: Microsoft открыл код СУБД DocumentDB, основанной на PostgreSQL
  6. OpenNews: Релиз FerretDB 2.0, реализации MongoDB на базе СУБД PostgreSQL
Автор новости: Alexander Korotkov
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/62991-postgresql
Ключевые слова: postgresql, orioledb
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (30) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 20:48, 31/03/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –7 +/
    Сколько глупостей в одном исследовании. Почему просто не сделаете свою СУБД со своими фишечками? Нет, надо внести ещё больший раздрай, 100500 вариантов, чтобы никто не разобрался и даже в теории не смог поддерживать всё это хозяйство.
     
     
  • 2.9, YetAnotherOnanym (ok), 21:43, 31/03/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Потому что потом автор "своей СУБД" окажется перед выбором - либо синкать свой патчсет с каждым релизом основной СУБД, либо остаться без всех тех улучшений, которые получит основная СУБД после создания форка.
    > ещё больший раздрай, 100500 вариантов

    Из которых каждому достаточно разобраться в том, которые мему подходит.

     
     
  • 3.10, Аноним (1), 21:53, 31/03/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А кто сказал, что это должен быть форк?
     
     
  • 4.27, YetAnotherOnanym (ok), 08:44, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > А кто сказал, что это должен быть форк?

    Это очевидным образом следует из текста новости - имеется успешно работающий продукт, к которому некие люди хотят прикрутить дополнительные фичи. Если ты считаешь, что для этого надо пилить с нуля новый велосипед, то я присоединюсь к рекомендации нах.а - пили.

     
  • 3.22, Аноним (22), 01:22, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Oracle DB - это большой энтерпрайс и госсектор. Альтернатива должна хорошо финансироваться. Весь бэкенд Сбера на oracledb был. Если не могут тащить свой форк - пусть сворачиваются.
     
     
  • 4.28, 1 (??), 09:04, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    SQL-я на ночь начитался ? Причём тут Oracle ? Или слава Доренко спать не даёт ?
     
  • 4.40, Аноним (40), 12:40, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Сбер форкнул Орацле? 8-) ;-)
     
  • 2.12, нах. (?), 22:10, 31/03/2025 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Сколько глупостей в одном исследовании. Почему просто не сделаете свою СУБД со своими
    > фишечками?

    делай, кто тебе мешает? Покажи парням, как надо!

    Эти вот - разумно полагают что повторить труд проделанный сотнями человек на двух континентах за 30 лет (больше, потому что был еще ingres) - немного так себе перспективка, можно и не дожить до результатов.

    > чтобы никто не разобрался и даже в теории не смог поддерживать всё это хозяйство.

    да ты и так не разберешься. Для тебя ничего не поменяется. Поддерживальщик...

     
     
  • 3.33, фывапролджэ (?), 10:02, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • +/
    post потому и пост, что не ингрес. а еще вертика появилась.
     
  • 2.13, ptr (ok), 22:15, 31/03/2025 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Хотя бы потому, что undo log - вовсе не панацея и есть немало профилей использования, где он проигрывает родному MVCC в PostgreSQL. Поэтому поддержка и того, и другого выглядит вполне логичным решением.
     
     
  • 3.37, фывапролджэ (?), 10:26, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Не поддержка, а access method. Так-то умников хватает, zheap тот же взять.
     
     
  • 4.49, ptr (ok), 19:16, 02/04/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Не поддержка, а access method. Так-то умников хватает, zheap тот же взять.

    Это разные вещи, причем в статье явно это показано. Текущая реализация API способов доступа не позволяет реализовать поддержку undo log.

     
  • 2.29, Аноним (29), 09:04, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • +/
    С нуля повторить тридцатилетний опыт разработки? Зачем? Многие вещи в Postgresql сделаны хорошо и проверены десятилетиями реального использования в крупных проектах. А любая новая реализация будет проходить по тем же (или новым) граблям ещё как минимум 10 лет.

    Форк? Патчи уже существует. Синхронизировать такие низкоуровневые патчи с изменениями в апстриме без деградации после каждого мажорного обновления практически нереально, только с огромным отставанием на полгода-год. Плюс, патчи, чтобы минимизировать их размер, специфичны именно для конкретного движка. А расширением внутренних структур и API предлагается открыть путь к реализации новых движков путем написания расширений. Существующий движок эти изменения никак не затронут - он ими пользоваться не будет. Хотя, в перспективе, решение с undo log могло бы стать и дефолтным - у него ряд бесспорных преимуществ.

     
  • 2.36, Аноним (-), 10:24, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • +3 +/
    p.s.s. когда я ещё был студентом наш преподаватель решил нам преподать .net. Не знаю почему, насколько мне известно в других универах не учили. Он такой спрашивает - вы знаете что сотворило Майкрософт? Новейшая перспективная технология ADO.NET. Кто-то уже использовал ADO? Я поднимаю руку, а он такой скептически типа откуда я её могу знать? И как-то прервал меня. А у Borland Delphi она уже годами существовала. Потом такой про базы данных начинает рассказывать, а на тот момент тот же (ныне убогий) Paradox уделывал их же Microsoft Access. И все равно он был популярней для обучения. Но главное как саму культуру программирования испоганили - на пустом месте раздувалось ЧСВ из-за того что кто-то одни технологии знает, а кто-то другие. И вот это пустое преимущество через рекламу, пиар, сарафанное радио откровенно грязные методы продвижения своих технологий
     
  • 2.38, Аноним (-), 10:32, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Зря вы удалили комментарий. Я о том что все это раздувание проблемы на пустом месте, а соответственно далее пойдет реклама других технологий - либо сделают расширение под переход на другие технологии (что вряд ли), либо далее пойдет реклама других СУБД, которые решают эту проблему.
     
  • 2.47, nrv (ok), 10:58, 02/04/2025 [^] [^^] [^^^] [ответить]  
  • +/
    ничего не глупостей
    движки нужны
    и помимо того, что нужно унифицировано их поставлять в форме дополнений
    нужно чтобы SQL код бесшовно работал между таблицами и индексами на разных движках
     

  • 1.2, нах. (?), 20:55, 31/03/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Так я что-то не понял - orioledb не в виде "годится для альфа-тестов" можно уже не ждать?

     
     
  • 2.42, Аноним (42), 15:22, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Не утрируйте:

    "...Status
    OrioleDB now has public beta status. It is recommended for experiments, testing, benchmarking, etc., but is not recommended for production usage..."

    Так что на данный момент, похоже, используют то, что имеется, что, как показывает новость, неоптимально для проекта. Потому предположу, что пока "можно не ждать" каких-то мега прорывных (по сравнению с ванильным PG) результатов.

     
     
  • 3.43, нах. (?), 15:43, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • +/
    молодой человек, вы понимаете сущность слова "гипербола", "метафора" или маску эту - на стройке нашли?

    > It is recommended for experiments, testing, benchmarking, etc.,

    вот это и был намек - что оно уже третий год рекомендед для бенчмаркинга, а судя по планов по реструктурированию громадью - мы и дальше будем только бенчмаркать, делая раз в месяц vacuum full.

    > Потому предположу, что пока "можно не ждать" каких-то мега прорывных (по сравнению с
    > ванильным PG) результатов.

    ванильный можно использовать (если осторожно). А тут похоже на признание что разработка застряла в безнадежном тупике и если авторы постгреза не захотят (а они не захотят потому что план госпопила импортозамещения сам себя не выполнит) круто поменять здоровенные куски кода - то так и останется for experiments.

      

     

  • 1.4, Аноним (4), 21:08, 31/03/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Мутный какой-то этот OrioleDB
    - замена данных по месту (без освобождения текущей записи и создания новой);
    - прямое связывание страниц в оперативной памяти со страницами в постоянном хранилище.

    Вспомнили прошлый век?!

     
     
  • 2.41, Аноним (42), 15:05, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > - замена данных по месту (без освобождения текущей записи и создания новой);
    > Вспомнили прошлый век?!

    Твое "современное" (постгресное) изменение строк путём добавления новой строки (для "простой и элегантной" реализации MVCC) наверное уместно только для таблиц без индексов. А для таблиц с индексами в системах, где данные меняются интенсивно - "какастрофа". Таблиц с индексами в БД обычно больше, чем без индексов. Да и эффект распухания БД из-за (пока) "неосвобожденных" строк и из-за вакуума (необходимого для их "освобождения") - "какастрофа плюс". А MVCC (для которого и было принято такое архитектурное решение) и другими средствами реализуется. Так что "прошлый век" (изменение строк инплэйс) _на практике_ рулит.

     
     
  • 3.44, Аноним (4), 17:03, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    И чего это люди FAT-ом и dbf-ами не пользуются - там же всё напрямую пишется, даже ram-only поля в файл проецируются с мусором.
     

  • 1.5, Аноним (5), 21:20, 31/03/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    OrioleDB и OracleDB это типа как Adibas и Adidas ?
     
     
  • 2.11, Аноним (4), 21:59, 31/03/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Есть такое. "Предлагаю улучшить в виндовсе формат exe до elf".
     
     
  • 3.14, Аноним (1), 22:36, 31/03/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > "Необходимо улучшить в виндовсе формат exe до elf".

    поправил

     
  • 2.30, 1 (??), 09:06, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • +/
    как ADABAS.
     
     
  • 3.32, Аноним (32), 09:22, 01/04/2025 [^] [^^] [^^^] [ответить]  
  • +/
    sapdb?
     

  • 1.23, zo0M (ok), 01:55, 01/04/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Когда уже проект без бета перейдёт в гамма стадию?
    @Alexander Korotkov какие планы на этот год?
     
  • 1.39, Аноним (39), 10:42, 01/04/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    сначала хотел написать "Александр, перелогоньтесь!" :) а потом увидел "Автор новости: Alexander Korotkov" :)

    желаю успехов в этом нелёгком деле :)

     
  • 1.46, Алексей Демаков (?), 10:43, 02/04/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А у вас уже есть механизм в tableam или где-то еще, который если в create table присутствует primary key, позволял бы создавать вместо стандартного btree какой-то альтернативный индекс? Мне бы такое тоже пригодилось. То есть хочется иметь возможность задавать альтернативу вот этому прибитию гвоздями:

    >#define DEFAULT_INDEX_TYPE "btree"
    >
    >index->accessMethod = constraint->access_method ? constraint->
    > access_method : DEFAULT_INDEX_TYPE;
    >
    >access_method_clause:
    > USING name  { $$ = $2; }
    > | /*EMPTY*/ { $$ = DEFAULT_INDEX_TYPE; }
    > ;

     
  • 1.48, nrv (ok), 11:03, 02/04/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    а вот интересно, в плане MVCC
    иные движки, например citus columnstore, повторяют стандартный MVCC? вообще должны ли они его иметь и если имеют, о чем речь в статье? что они должны повторять его с пользовательской точки зрения или подкапотной?
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2025 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру