Подтвердить что ты не робот

Эффективный способ обновления всех строк в таблице

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

Я попытался использовать отдельные транзакции для выбора каждого следующего фрагмента из 100 записей и обновления значения для них, но все же это занимает несколько часов, чтобы обновить все записи в Oracle10, например.

Каков наиболее эффективный способ сделать это в SQL, не используя некоторые специфичные для диалекта функции, поэтому он работает повсюду (Oracle, MSSQL, MySQL, PostGre и т.д.)?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: нет вычисленных полей. Есть индексы. Используемые сгенерированные операторы SQL, которые обновляют таблицу по строкам.

4b9b3361

Ответ 1

Обычный способ - использовать UPDATE:

UPDATE mytable
   SET new_column = <expr containing old_column>

Вы должны иметь возможность сделать это - одна транзакция.

Ответ 2

Как говорит Марсело:

UPDATE mytable
SET new_column = <expr containing old_column>;

Если это происходит слишком долго и не удается из-за слишком старых снимков "моментального снимка" (например, если выражение запрашивает другую высокоактивную таблицу), и если новое значение для столбца всегда равно NULL, вы можете обновить таблицу в партии:

UPDATE mytable
SET new_column = <expr containing old_column>
WHERE new_column IS NULL
AND ROWNUM <= 100000;

Просто запустите этот оператор, COMMIT, а затем запустите его снова; rinse, повторите, пока не сообщит "Обновлено 0 строк". Это займет больше времени, но каждое обновление будет менее вероятным.

Ответ 3

Вы можете удалить любые индексы в таблице, затем внести свою вставку и затем воссоздать индексы.

Ответ 4

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

created updated_ {table_name}, затем выберите вставку в эту таблицу пакетами. После этого, и это зависит от Oracle (который я не знаю и не использую), поддерживающего возможность переименования таблиц в атомном режиме. updated_ {table_name} становится {table_name}, а {table_name} становится оригинальным_ {table_name}.

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