Я использую приведенный ниже оператор обновления, и он слишком медленный (это занимает около 10-12 секунд)
UPDATE temp_final t
SET name = (
SELECT DISTINCT(nm.name)
FROM table_name nm,
temp_final fn
WHERE nm.id = fn.senid
AND fn.senid = t.senid
AND fn.rowgroup = t.rowgroup
AND fn.mid = t.mid
AND fn.sid = t.sid
AND fn.pid = t.pid
AND fn.reid = t.reid
AND fn.retype = t.retype
)
WHERE t.reid = n_reid
AND t.retype = n_retype
AND t.sid = c_sid
AND t.pid = n_pid;
Столбцы таблицы temp_final не индексируются, так как эта таблица содержит большое количество обновлений данных. Я думаю, я не могу преобразовать коррелированный подзапрос в объединение, так как он использует отдельное предложение. План этого запроса дает следующий результат:
OPERATION OBJECT CARDINALITY COST
- UPDATE STATEMENT 1925 337046
- UPDATE temp_final
-TABLE ACCESS(FULL) temp_final 1925 171
- Filter Predicates
- AND
-T.SID='123'
-T.PID=21
-T.REID=9
-T.RETYPE=1
-SORT(UNIQUE) 1 175
- NESTED LOOPS 1 174
-TABLE ACCESS(BY INDEX ROWID) TABLE_NAME 1 2
-INDEX(UNIQUE SCAN) NAME_PK 1 1
-ACCESS PREDICATES
NM.ID=:B1
-TABLE ACCESS(FULL) temp_final 1 172
- Filter Predicates
- AND
-fn.mid=:B1
-fn.senid=:B2
-fn.sid =:B3
-fn.rowgroup =:B4
-fn.pid=:B5
-fn.reid=:B6
-fn.retype=:B7
-nm.id = fn.senid
Таблица temp_final содержит около 8 тыс. Записей, а таблица table_name содержит около 2 записей lac
Пожалуйста, дайте мне знать, как я могу улучшить производительность этого запроса?
Привет