类似NL的update更新

update b set b.object_name=(select a.object_name from a where a.object_id=b.object_id);

create table a as (select * from (select * from dba_objects order by object_id) where rownum<100)


create table b as (select * from (select * from dba_objects order by object_id) where rownum<100)


SQL> update b set object_name=object_name||'xxx';

99 rows updated.


SQL> select count(*) from a;

  COUNT(*)
----------
	99

子查询会被扫描99次

SQL> alter session set statistics_level=all;

Session altered.

SQL> update b set b.object_name=(select a.object_name from a where a.object_id=b.object_id);

99 rows updated.

SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------
SQL_ID	9n2d868fqhcq4, child number 0
-------------------------------------
update b set b.object_name=(select a.object_name from a where
a.object_id=b.object_id)

Plan hash value: 1917715316

-------------------------------------------------------------------------------------
| Id  | Operation	   | Name | Starts | E-Rows | A-Rows |	 A-Time   | Buffers |
-------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |	  |	 1 |	    |	   0 |00:00:00.01 |	504 |
|   1 |  UPDATE 	   | B	  |	 1 |	    |	   0 |00:00:00.01 |	504 |
|   2 |   TABLE ACCESS FULL| B	  |	 1 |	 99 |	  99 |00:00:00.01 |	  4 |
|*  3 |   TABLE ACCESS FULL| A	  |	99 |	  1 |	  99 |00:00:00.01 |	396 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("A"."OBJECT_ID"=:B1)

Note
-----
   - dynamic sampling used for this statement (level=2)


25 rows selected.


可以看到A表被扫描了99次,类似于NL。

原文地址:https://www.cnblogs.com/hzcya1995/p/13352387.html