Обновление по rowid прошло в режиме полной проверки - PullRequest
0 голосов
/ 27 мая 2020

Я выполняю простое обновление (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 |
-------------------------------------------------------------------------------------------------------
...