我正在执行一个简单的更新(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)
其中,表2包含大约10m的记录。在执行计划中,我看到在t\u table1上进行了一次完整的表扫描,这需要很多时间。
我想原因是t\u table2.t1\u rowid=t\u 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 |
-------------------------------------------------------------------------------------------------------
暂无答案!
目前还没有任何答案,快来回答吧!