2012-03-28 6 views
2

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

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

+0

Почему, по вашему мнению, на обновление потребуется около часа? Я только что сделал тест на производственной таблице с ~ 3 400 000 строк. Добавление нового столбца заняло 4,366 мс, создание индекса - 8725,777 мс. – strkol

ответ

1

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

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

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

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

+0

, и если никто не обновляет исходную таблицу, пока это происходит – xordon

Смежные вопросы