О деталях реализации последовательности PostgreSQL
Меня интересуют детали реализации последовательностей в PostgreSQL, причина в том, что они используются в фоновом режиме для SERIAL
тип. Я рассмотрел исходный файл здесь (находится в поиске Google: "последовательность исходного кода postgresql"), хотя не ясно, к какой версии PG относится этот файл. Я понимаю общий поток кода в функции nextval_internal
, что является суть проблемы, но кодовая база PG большая, и я просто не могу позволить себе время, чтобы исследовать эту проблему в полном объеме.
Мне интересно знать:
- Какова политика постоянства в отношении последовательностей? Как они загружаются при запуске сервера PG и как они сохраняются в течение всего срока службы сервера, чтобы предотвратить сбои после сбоя / сбоя питания сервера?
- Каковы затраты времени выполнения, связанные с использованием последовательностей? Всегда ли они несут какой-то дисковый ввод-вывод, или никогда вообще?
- Каковы недостатки в использовании последовательностей, которые я должен учитывать при определении таблиц и написании кода приложения?
1 ответ
Последовательности во многом похожи на обычные таблицы: они находятся в pg_class
каталог и у них есть файл данных, в котором хранится текущее значение.
В последних версиях PostgreSQL (как побочный эффект создания ALTER SEQUENCE
полностью транзакционный) вы также должны SELECT
из последовательности, чтобы увидеть его текущее значение.
Постоянство обрабатывается транзакционно, как в обычной таблице (хотя nextval
не является транзакционным), поэтому изменения проходят через журнал транзакций, но в отличие от обычных таблиц многовариантность отсутствует. Скорее, один ряд последовательности изменяется "на месте". Это нормально, потому что нам не нужны разные версии для значения, и VACUUM
никогда не сможет идти в ногу с уборкой в занятой последовательности.
Чтобы ответить на ваши вопросы индивидуально:
Во время восстановления изменения в последовательности воспроизводятся из WAL, как и любые другие изменения данных.
Использование последовательности очень мало накладных расходов. Модификации не будут вызывать ввод / вывод все время, потому что последовательности кэшируются в общих буферах, как и все другие таблицы. Только на контрольно-пропускных пунктах они должны сохраняться в хранилище, и необходимо учитывать небольшое количество WAL.
Если вы хотите еще больше сократить использование последовательностей, определите их с помощью
CACHE
больше, чем один.Нет проблем с использованием последовательностей. Это лучший способ генерировать уникальные номера.