Чи оптимізує PostgreSQL додавання стовпців із ненульовими ЗАМЕЧЕННЯми?


10

Додаючи NOT NULLстовпці зі DEFAULTзначенням - чи оптимізує PostgreSQL цю операцію?

У випадку, якщо таблиця має n рядків, неоптимізований стовпець alter-table-add дасть n записів за замовчуванням - що, очевидно, може бути дуже болісним. З оптимізацією БД миттєво створить новий стовпець, збереже лише одну копію значення за замовчуванням, яке буде повернуто, коли для цього стовпця не буде знайдено не за замовчуванням значення у відповідній структурі даних індексу.

Наприклад, Oracle 11g має таку оптимізацію .

Відповіді:


16

У PostgreSQL такого механізму немає.

Однак ви все одно можете уникнути надмірних наслідків такої зміни таблиці.

Наступне твердження набуває виключного блоку доступу на таблиці протягом тривалості виписки / транзакції:

ALTER TABLE your_table
    ADD COLUMN new_column integer NOT NULL DEFAULT 0;

Це твердження змінює каталог, після чого переписує всю таблицю, щоб новий стовпець містив значення за замовчуванням у всіх рядках. Якщо таблиця має багато рядків і до неї звертаються досить часто, це може спричинити деякі тимчасові проблеми.

Щоб уникнути цього, спробуйте утримати ексклюзивний замок якомога коротше:

ALTER TABLE your_table
    ADD COLUMN new_column integer;
ALTER TABLE your_table
    ALTER COLUMN new_column SET DEFAULT 0;

Оскільки це в основному лише (фактично дві) зміни в каталозі (жодна зміна даних не відбувається), вона завершиться досить швидко. Тоді, залежно від ваших потреб та використання таблиці, ви можете оновити новий стовпець до типового значення за один крок або партіями, а по завершенні встановити стовпчик на NOT NULL.

Оновлення про реалізацію бажання: PostgreSQL 11 матиме цю функцію. Дивіться https://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/ для отримання додаткової інформації.


4

Так, з PostgreSQL 11

Ця функція нова та розміщена у версії 11.

ALTER TABLE your_table
    ADD COLUMN new_column integer NOT NULL DEFAULT 0;

Наведене вище - одна така команда, на яку вплине ця оптимізація; але, слід сказати, NOT NULLце не потрібно. Будь-який новий стовпець, доданий із ненульовим значенням за замовчуванням, зараз оптимізований. Ви можете знайти запис на цьому комітеті. Ви також повинні перевірити цю велику написання про нього, "Пропущене посилання в Postgres 11: Швидке створення стовпців із замовчуванням" .

Обхід до PostgreSQL 11

Якщо ви намагаєтеся уникати ексклюзивного столового замка на столі, дотримуйтесь порад Крейга Рінгера,

  • Додати стовпець без а DEFAULT
  • ALTERйого слід додати DEFAULTпісля цього, щоб він застосовувався до нещодавно вставлених рядків
  • Потім заповніть новий стовпець у існуючих рядках прогресивною партією UPDATEs
  • Коли всі рядки мають значення, ви додаєте NOT NULLобмеження
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.