Я хочу знать, как наиболее эффективно обновить каждую строку в чрезвычайно большой таблице Oracle для одного столбца. Например:
update mytable set mycolumn=null;
или:
update mytable set mycolumn=42;
Мои знания вполне могут быть устаревшими. Что я делаю, так это изменяю таблицу, чтобы удалить столбец. Затем я изменяю таблицу, чтобы добавить столбец со значением по умолчанию нового значения, которое я хочу использовать. Затем я изменяю таблицу, чтобы удалить значение по умолчанию для столбца. Я считаю, что это намного быстрее, чем просто запуск обновления, но у меня есть ощущение, что есть лучший метод.
Ответы:
Многое зависит от других действий, происходящих с этой таблицей во время массового обновления. Я надеюсь, что у вас есть какая-то тестовая среда, где вы можете запустить несколько примеров того, что вы хотели бы сделать, и понять, какой путь лучше. Я бы попробовал:
update table set column_name = blah
;updating the column=blah
а также зафиксировать каждые X обновлений (возможно, 10000). Вы можете распараллелить этот код, скопировав его и сделав его копированием, сделав отдельный раздел Первичных ключей.У нас была очень похожая проблема с таблицей, которая очень активно использовалась в системе OLTP, и мы смогли распараллелить ее 5 раз и запустить без влияния блокировки пользователя на таблицу строк более 100 ММ, фиксирующую каждые 10000. Вы не сказали, как большой размер вашего стола или какое приложение вы используете, но такое решение может вам подойти.
источник
Для быстрого
UPDATE
, убедитесь, что у вас нет триггеров, которые стреляют.Не забудьте включить только те, которые вы хотите, когда вы закончите.
Вы также можете столкнуться с накладными расходами на обслуживание индекса. Попробуйте перестроить ваши индексы отдельно. Чтобы сделать это, здесь должен быть полезен ответ Паппеса: /programming/129046/disable-and-later-enable-all-table-indexes-in-oracle
Я повторяю ответ Папес здесь для справки. (Обратите внимание, что эта команда SPOOL делает предположения о вашей платформе и среде.)
Делать импорт ...
источник
удалить индекс. обновить столбец. вернуть индекс обратно. но если столбец содержит одно и то же значение для всех строк, вы можете удалить индекс.
источник
Если у вас нет ограничения по пространству, вы можете создать новую таблицу, такую же, как ваша таблица, с добавленным в нее новым столбцом и удалить старую таблицу:
источник
Попробуйте несколько обновлений / коммитов. Вставка / обновление / удаление слишком большого количества строк без фиксации приводит к большой нагрузке ввода-вывода. Он может быть довольно оптимизирован, зная размеры блоков, записи размеров и прочего.
Для удаления целых данных в таблице,
truncate table x
лучше, чемdelete from x
. Также очистка делает другую рабочую нагрузку процесса.Редактировать: Вы можете использовать
inmemory
опцию, загружая таблицу в память в столбчатом формате, а затем выполнить обновление. это действительно зависит от отношений и структуры вашей БД. Смотрите эту статью .источник
truncate
илиdelete
будет какой-либо помощи.