@beduin01

Что происходит в момент добавления нового столбца в БД?

Документацию почитал. Вопросы остались.
Вот есть таблица с 1000 записей. В ней 9 колонок. На 3 из них есть индексы.
Я добавляю новую колонку и...

1. Возможно ли дозапись новой колонки в существующую структуру? Или под капотом происходит полное копирование всех данных в новую таблицу (табличное пространство?)
2. Происходит ли пересоздание индексов?
3. Происходят ли какие-то еще важные для понимания сути работы в БД процессы?
  • Вопрос задан
  • 151 просмотр
Решения вопроса 2
Melkij
@Melkij
PostgreSQL DBA
https://ru.stackoverflow.com/q/721985/203622

Вот есть таблица с 1000 записей. В ней 9 колонок. На 3 из них есть индексы.

На такой мелочи без разницы. Перезапись такой крохи штука быстрая.

1. Возможно ли дозапись новой колонки в существующую структуру? Или под капотом происходит полное копирование всех данных в новую таблицу (табличное пространство?)

В зависимости от конкретного alter table add column.
Если вы добавляете add column score float default random() - то будем переписывать всю таблицу и перестраивать все существующие индексы.
Если default с константой и у вас pg11 или новее - то обновим в системном каталоге описание таблицы, а саму таблицу трогать не будем.
Если нет default (т.е. null) - то без оглядки на версию базы просто обновим описание таблицы и сами файлы таблицы трогать не будем.

2. Происходит ли пересоздание индексов?

да, если выполняется table rewrite

3. Происходят ли какие-то еще важные для понимания сути работы в БД процессы?

классическая история частых даунтаймов, что для операции нужна эксклюзивная блокировка. То есть для взятие блокировки не должно быть совсем никого, кто эту таблицу трогал в транзакции, начавшейся до alter table. Если у вас в это время работает какая-то аналитика на 10 минут или pg_dump - будут приключения, нужен statement_timeout
Ответ написан
fzfx
@fzfx
18,5 дм
я не понял, что имеется ввиду под дозаписью колонки в существующую структуру. если колонка создаётся без указания default-значения, то перезаписи строк в таблице не происходит, меняется лишь заголовочная часть (в которую добавляется информация о новой колонке) и битовая карта null'ов (относительно дешёвая операция). если колонка создаётся с указанием default-значения, то происходит пересоздание (удаление и новая вставка) всех строк в таблице с добавлением нового поля с default-значением (со всеми вытекающими в виде сбросов грязных страниц на диск, частичным вымыванием кеша, генерацией WAL, запусками автовакуума). индексы при этом также перезаписываются в моменты проходов автовакуума (при вычищении мёртвых версий строк указатели в индексах меняются на актуальные версии строк).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы