按rowid更新已进入完全扫描

n3schb8v  于 2021-07-26  发布在  Java
关注(0)|答案(0)|浏览(191)

我正在执行一个简单的更新(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 |
-------------------------------------------------------------------------------------------------------

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题