О деталях реализации последовательности PostgreSQL

Меня интересуют детали реализации последовательностей в PostgreSQL, причина в том, что они используются в фоновом режиме для SERIAL тип. Я рассмотрел исходный файл здесь (находится в поиске Google: "последовательность исходного кода postgresql"), хотя не ясно, к какой версии PG относится этот файл. Я понимаю общий поток кода в функции nextval_internal, что является суть проблемы, но кодовая база PG большая, и я просто не могу позволить себе время, чтобы исследовать эту проблему в полном объеме.

Мне интересно знать:

  • Какова политика постоянства в отношении последовательностей? Как они загружаются при запуске сервера PG и как они сохраняются в течение всего срока службы сервера, чтобы предотвратить сбои после сбоя / сбоя питания сервера?
  • Каковы затраты времени выполнения, связанные с использованием последовательностей? Всегда ли они несут какой-то дисковый ввод-вывод, или никогда вообще?
  • Каковы недостатки в использовании последовательностей, которые я должен учитывать при определении таблиц и написании кода приложения?

1 ответ

Решение

Последовательности во многом похожи на обычные таблицы: они находятся в pg_class каталог и у них есть файл данных, в котором хранится текущее значение.

В последних версиях PostgreSQL (как побочный эффект создания ALTER SEQUENCE полностью транзакционный) вы также должны SELECT из последовательности, чтобы увидеть его текущее значение.

Постоянство обрабатывается транзакционно, как в обычной таблице (хотя nextval не является транзакционным), поэтому изменения проходят через журнал транзакций, но в отличие от обычных таблиц многовариантность отсутствует. Скорее, один ряд последовательности изменяется "на месте". Это нормально, потому что нам не нужны разные версии для значения, и VACUUM никогда не сможет идти в ногу с уборкой в ​​занятой последовательности.

Чтобы ответить на ваши вопросы индивидуально:

  • Во время восстановления изменения в последовательности воспроизводятся из WAL, как и любые другие изменения данных.

  • Использование последовательности очень мало накладных расходов. Модификации не будут вызывать ввод / вывод все время, потому что последовательности кэшируются в общих буферах, как и все другие таблицы. Только на контрольно-пропускных пунктах они должны сохраняться в хранилище, и необходимо учитывать небольшое количество WAL.

    Если вы хотите еще больше сократить использование последовательностей, определите их с помощью CACHE больше, чем один.

  • Нет проблем с использованием последовательностей. Это лучший способ генерировать уникальные номера.

Другие вопросы по тегам