Добавить столбец без времени простоя - PullRequest
2 голосов
/ 28 марта 2012

Мне нужно добавить дельта-столбец для мышления-сфинкса в моей таблице с 17 миллионами записей, затем мне нужно проиндексировать это поле.

База данных является postgres, и добавление столбца приведет к простоямв течение часа, который непосильный, поэтому любые предположения / идеи о том, как таблица может быть изменена, чтобы не было блокировки для всей таблицы.

1 Ответ

1 голос
/ 28 марта 2012

Единственное решение, которое я могу придумать, чтобы избежать блокировки таблицы long , - это создать новую таблицу с желаемой структурой.Затем используйте INSERT INTO ... SELECT для заполнения этой таблицы, заново создайте все индексы (включая новый), а затем переименуйте новую таблицу в старую таблицу.

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

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

Это, конечно, возможно, только если у вас достаточно места дляВы можете хранить полную копию таблицы.

...