Поскольку запрос, который вы указали в вопросе, содержит подзапрос, он выполняет поиск в таблице b для каждой обновляемой строки. Это может быть медленным, и обновление все равно достаточно медленное.
В зависимости от дизайна ваших таблиц, я бы попытался «ОБНОВИТЬ вид» или MERGE. Способность к UPDATE зависит от наличия «ключа-сохраненного соединения». Если у вас этого нет, UPDATE не будет работать. Трудно дать правильный ответ без какого-либо DDL для таблиц.
UPDATE (
select col1a, col1b, col2a, col2b
from
a join b on (a.col2a = b.col2b)
)
set col1a = col1b;
Если UPDATE не работает, вы можете попробовать MERGE. Это должно работать в большем количестве случаев, чем обновление.
merge into a
using b on (a.col2a = b.col2b)
when matched then update set a.col1a = b.col1b
Преимущество обоих этих утверждений состоит в том, что они работают на весь набор данных, а не обновляются по одной строке за раз. Это может быть трудно получить обновление для выполнения хорошо.
Возможно, стоит удалить любые индексы на столбце col1a
, если они есть.
Вы можете использовать ключевое слово LIMIT или даже сделать свой собственный интервал, используя поле «ID», если вы получили один (1 <идентификатор <5000 [...]) – RelevantUsername
10 миллионов строк не так много данных в эти дни. Почему вы хотите совершать интервалы? Это, как минимум, сделает вещи медленнее. И для этого потребуется еще немного кода. И он будет генерировать больше 'UNDO' и' REDO'. Вы действительно уверены, что это то, что вы хотите сделать? –
Я должен совершать через равные промежутки времени. Но не уверен в том, что строка no совершает. Это входной параметр процедуры. Я должен зафиксировать на основе входного параметра. –