Добавить столбец со значением по умолчанию в postgresql без блокировки на уровне таблицы - PullRequest
0 голосов
/ 04 июля 2018

Есть такая проблема - таблица с более чем 20 млн строк.

Когда я добавляю новый столбец по умолчанию - таблица блокировки postgresql более 40 минут, поэтому мое приложение перестает работать на это время.

Так что вместо

ALTER TABLE "test" ADD COLUMN "field" boolean DEFAULT True NOT NULL;

Я делаю

ALTER TABLE "test" ADD COLUMN "field" boolean NULL;
ALTER TABLE "test" ALTER COLUMN "field" SET DEFAULT true;

, после чего каждая новая строка будет иметь значение true по умолчанию, поэтому теперь мне нужно обновить 20 миллионов текущих строк.

Я обновляю их партиями:

WITH cte AS (
SELECT id as pk
FROM "test"
WHERE  "field" is null
LIMIT  10000
)
UPDATE "test" table_
SET "field" = true
FROM   cte
WHERE  table_.id = cte.pk

после чего я делаю

ALTER TABLE "test" ALTER COLUMN "field" SET NOT NULL;

И все в порядке, но когда я обновляю строки, это слишком медленно. Можете ли вы дать мне несколько советов по улучшению скорости обновления?

В настоящее время обновляется 10000 примерно за 2 минуты. Я пытаюсь уменьшить размер до 1000 - это было лучше (3,5 минуты на 10000), но все равно медленно.

Я также пытаюсь создать индекс перед обновлением, но он не дает лучших результатов (насколько я понимаю, он даст лучший результат, но когда будет обновлен огромный путь к таблице).

1 Ответ

0 голосов
/ 04 июля 2018

Вы можете ускорить UPDATE с HOT . Для этого требуется, чтобы обновленный столбец не индексировался (это легко в вашем случае) и чтобы в табличных блоках было свободное место (fillfactor <100). Не уверен, что вы соответствуете второму требованию. </p>

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

Возможно, вы можете подождать несколько месяцев для PostgreSQL v11 . Следующая новая функция будет делать то, что вам нужно:

  • Разрешить ALTER TABLE добавить столбец с ненулевым значением по умолчанию без перезаписи таблицы (Эндрю Данстан, Серж Риелау)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...