У меня есть 3 таблицы:
- Таблица A: 170 миллионов данных
- Таблица B: 170 миллионов данных
- Таблица C: 130 миллионов данных
- Журнал таблицы
Я хочу обновить столбец colA1 со значением colC4, если colA2 == colB2 и colB3< /em> == colC3. Я создал таблицу:
- Таблица D: 80 миллионов данных для хранения colB2 и colC3 для ускорения выполнения запроса.
Я также добавляю индекс для colB3 в таблицу D.
Табличный журнал используется для хранения сообщений о ходе выполнения и времени завершения при каждом завершении итерации (см. сценарий).
В настоящее время мой сценарий обновления выглядит следующим образом:
v_str_log := 'Begin updating';
p_write_to_log(v_str_log);
commit;
for data_list in
(
select distinct colC4
from tableC
)
loop
update tableA
set colA1 = data_list.colC4
where colA2 in
(
select colB2
from tableD
where colC3 = data_list.colC4
)
var_total := var_total + sql%rowcount;
v_str_log := 'Updated ' || sql%rowcount || ' for ' || card.sim_type || ' with total ' || var_total || ' rows.';
commit;
end loop;
Я запустил процедуру, и она закончилась примерно через 6 часов. Но я обнаружил из журнала, что для первого цикла 3 миллиона данных выполняются в течение 3 минут, но через несколько итераций 5 миллионов данных выполняются примерно за 20 минут. Запрос выполняется не так быстро, как первые итерации
Почему это могло произойти? Можно ли оптимизировать скрипт?