zoukankan      html  css  js  c++  java
  • 关于dblink语句的优化

    oracle一般把使用dblink的表做为远端,下面语句把yz.remot_tab作为远程表
    SQL> select l.object_id,l.object_name from yzxd.local_tab l,yz.remot_tab@remote r  where l.object_id=r.object_id and l.object_id=2;
    
     OBJECT_ID OBJECT_NAME
    ---------- --------------------------------------------------------------------------------------------------------------------------------
    	 2 C_OBJ#
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 635280512
    
    --------------------------------------------------------------------------------------------------
    | Id  | Operation	         | Name	     | Rows  | Bytes | Cost (%CPU)| Time	 | Inst   |IN-OUT|
    --------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT     |		     |     1 |    24 |     4   (0)| 00:00:01 |	      |	 |
    |   1 |  MERGE JOIN CARTESIAN|		     |     1 |    24 |     4   (0)| 00:00:01 |	      |	 |
    |*  2 |   TABLE ACCESS FULL  | LOCAL_TAB |     1 |    11 |     3   (0)| 00:00:01 |	      |	 |
    |   3 |   BUFFER SORT	     |		     |     1 |    13 |     1   (0)| 00:00:01 |	      |	 |
    |   4 |    REMOTE	         | REMOT_TAB |     1 |    13 |     1   (0)| 00:00:01 | REMOTE | R->S |
    --------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - filter("L"."OBJECT_ID"=2)
    
    Remote SQL Information (identified by operation id):
    ----------------------------------------------------
    
       4 - SELECT "OBJECT_ID" FROM "YZ"."REMOT_TAB" "R" WHERE "OBJECT_ID"=2 (accessing
           'REMOTE' )
    
    
    
    Statistics
    ----------------------------------------------------------
    	  1  recursive calls
    	  0  db block gets
    	  4  consistent gets
    	  0  physical reads
    	  0  redo size
    	623  bytes sent via SQL*Net to client
    	552  bytes received via SQL*Net from client
    	  2  SQL*Net roundtrips to/from client
    	  1  sorts (memory)
    	  0  sorts (disk)
    	  1  rows processed
    	  
    
    使用driving_site 把yz.remot_tab作为本地表,会把谓词access("A1"."OBJECT_ID"=2)传到远端执行,把执行结果传输过来而不是把整个表的数据传输过来
    SQL> select /*+driving_site(r) */ l.object_id,l.object_name from yzxd.local_tab l,yz.remot_tab@remote r  where l.object_id=r.object_id and l.object_id=2;
    
     OBJECT_ID OBJECT_NAME
    ---------- --------------------------------------------------------------------------------------------------------------------------------
    	 2 C_OBJ#
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1476067701
    
    -----------------------------------------------------------------------------------------------------------------
    | Id  | Operation	           | Name			        | Rows	| Bytes | Cost (%CPU)| Time	    | Inst	 |IN-OUT|
    -----------------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT REMOTE|			            |     2 |   168 |     3   (0)| 00:00:01 |	     |	|
    |   1 |  MERGE JOIN CARTESIAN  |			            |     2 |   168 |     3   (0)| 00:00:01 |	     |	|
    |   2 |   REMOTE	           | LOCAL_TAB		        |     1 |    79 |     2   (0)| 00:00:01 |      ! | R->S |
    |   3 |   BUFFER SORT	       |			            |     2 |    10 |     1   (0)| 00:00:01 |	     |	|
    |*  4 |    INDEX RANGE SCAN    | IDX_OBJECTID_REMOT_TAB |     2 |    10 |     1   (0)| 00:00:01 |   QDDS |	|
    -----------------------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       4 - access("A1"."OBJECT_ID"=2)
    
    Remote SQL Information (identified by operation id):
    ----------------------------------------------------
    
       2 - SELECT "OBJECT_NAME","OBJECT_ID" FROM "YZXD"."LOCAL_TAB" "A2" WHERE "OBJECT_ID"=2 (accessing '!' )
    
    
    Note
    -----
       - fully remote statement
    
    
    Statistics
    ----------------------------------------------------------
    	  9  recursive calls
    	  0  db block gets
    	  4  consistent gets
    	  0  physical reads
    	  0  redo size
    	623  bytes sent via SQL*Net to client
    	552  bytes received via SQL*Net from client
    	  2  SQL*Net roundtrips to/from client
    	  0  sorts (memory)
    	  0  sorts (disk)
    	  1  rows processed
    
    	  
    insert、update、delete 会使hint driving_site失效
    SQL> insert into yzxd.mid_tab select /*+driving_site(r) */  l.object_id,l.object_name from yzxd.local_tab l,yz.remot_tab@remote r  where l.object_id=r.object_id and l.object_id< 100;
    
    98 rows created.
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 728795340
    
    ------------------------------------------------------------------------------------------------------
    | Id  | Operation		         | Name      | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |IN-OUT|
    ------------------------------------------------------------------------------------------------------
    |   0 | INSERT STATEMENT	     |	         |	   9 |	 216 |	   5   (0)| 00:00:01 |	      |      |
    |   1 |  LOAD TABLE CONVENTIONAL | MID_TAB   |	     |	     |		      |	     |	      |      |
    |*  2 |   HASH JOIN		         |	         |	   9 |	 216 |	   5   (0)| 00:00:01 |	      |      |
    |*  3 |    TABLE ACCESS FULL	 | LOCAL_TAB |	   9 |	  99 |	   3   (0)| 00:00:01 |	      |      |
    |   4 |    REMOTE		         | REMOT_TAB |	  97 |	1261 |	   2   (0)| 00:00:01 | REMOTE | R->S |
    ------------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - access("L"."OBJECT_ID"="R"."OBJECT_ID")
       3 - filter("L"."OBJECT_ID"<100)
    
    Remote SQL Information (identified by operation id):
    ----------------------------------------------------
    
       4 - SELECT /*+ OPAQUE_TRANSFORM */ "OBJECT_ID" FROM "YZ"."REMOT_TAB" "R" WHERE
           "OBJECT_ID"<100 (accessing 'REMOTE' )
    
    
    
    Statistics
    ----------------------------------------------------------
    	  4  recursive calls
    	 36  db block gets
    	211  consistent gets
    	  2  physical reads
           4240  redo size
    	863  bytes sent via SQL*Net to client
    	985  bytes received via SQL*Net from client
    	  3  SQL*Net roundtrips to/from client
    	  2  sorts (memory)
    	  0  sorts (disk)
    	 98  rows processed
    
    要想dml driving_site不失效,使用for循环查到语句一条一条插入。
    BEGIN
        FOR i IN (select /*+driving_site(r) */  l.object_id,l.object_name from yzxd.local_tab l,yz.remot_tab@remote r  where l.object_id=r.object_id and l.object_id< 100)
       LOOP
         insert into yzxd.mid_tab values(i.object_id,i.object_name);
    	 commit;
      END LOOP;
      COMMIT;
    END;
    

      

  • 相关阅读:
    uboot 环境变量
    U-boot的环境变量: bootcmd 和bootargs
    linux中的rootfs/initrd/ramfs/initramfs
    关于Linux启动时挂载rootfs的几种方式
    u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统
    MySQL列出当前月的每一天
    SQL 标量函数-----日期函数 day() 、month()、year()
    mysql 中 DATE_ADD函数和 DATE_SUB函数用法
    mysql 中 DATE_ADD(date,INTERVAL expr type)
    mysql中date_add()函数的使用?
  • 原文地址:https://www.cnblogs.com/omsql/p/13158333.html
Copyright © 2011-2022 走看看