Есть такая проблема - таблица с более чем 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), но все равно медленно.
Я также пытаюсь создать индекс перед обновлением, но он не дает лучших результатов (насколько я понимаю, он даст лучший результат, но когда будет обновлен огромный путь к таблице).