Я выполняю простое обновление (Oracle 11g DB):
update t_table1
set (field1,field2,field3,field4,field5) =
(
select temp_field2,temp_field3,sysdate,0,0
from t_table2
where t_table2.t1_rowid = t_table1.rowid
)
where t_table1.rowid in (select /*+result_cache*/ t_table2.t1_rowid from t_table2)
, где t_table2 содержит более или менее 10M записей. В плане выполнения я вижу полное сканирование таблицы на t_table1, которое требует много времени.
Я полагаю, причина в условии t_table2.t1_rowid = t_table1.rowid where. Можно ли избежать полной проверки?
-------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 9980K| 549M| 200M (25)|670:03:30 |
| 1 | UPDATE | t_table1 | | | | |
| 2 | HASH JOIN | | 9980K| 549M| 2036K (2)| 06:50:00 |
| 3 | TABLE ACCESS FULL | t_table2 | 9980K| 94M| 10624 (2)| 00:02:00 |
| 4 | TABLE ACCESS FULL | t_table1 | 420M| 23G| 532K (3)| 01:46:30 |
| 5 | TABLE ACCESS BY INDEX ROWID| t_table2 | 1 | 22| 3 (0)| 00:00:01 |
| 6 | INDEX UNIQUE SCAN | t_table2_PK_1 | 1 | | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------------