О деталях реализации последовательности PostgreSQL - PullRequest
0 голосов
/ 15 января 2019

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

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

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

1 Ответ

0 голосов
/ 15 января 2019

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

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

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

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

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

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

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

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

...