右连接RIGHT JOIN Oracle SQL优化实例

    Consistent gets(数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块)这里的概念是在处理你这个操作的时候需要在一致性读状态上处理多少个块,这些块产生的主要原因是因为由于在你查询的过程中,由于其他会话对数据块进行操作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所以需要对回滚段中的数据块的前映像进行查询,以保证数据的一致性。这样就产生了一致性读。

 

1. SQL_ID='2s7gsktyny0yq'

代入绑定变量的值:
SELECT UHS.ID,
       UHS.ORG_ID,
       UHS.JOB_ID,
       UHS.HOLIDAY_SYSTEM_NAME,
       UHS.DOWN_FLAG,
       UHS.BEGIN_DATE,
       UHS.END_DATE,
       UHS.STATE,
       UHS.STATE_DATE,
       UHS.CREATE_DATE,
       UHS.OPER_TYPE,
       UHS.COMMENTS,
       UO.ORG_PATH_CODE
  FROM IOPR1.UOS_HOLIDAY_SYSTEM UHS
 RIGHT JOIN IOPR1.UOS_ORG UO ON UHS.ORG_ID = UO.ORG_ID
 WHERE UHS.STATE = '10A' START WITH UO.ORG_ID = 1899
CONNECT BY UO.ORG_ID = PRIOR UO.PARENT_ID
 ORDER BY UO.ORG_PATH_CODE DESC;
 
执行计划为:

Plan hash value: 3518211019

--------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |                    |  4747 |   421K|    18  (12)| 00:00:01 |
|   1 |  SORT ORDER BY                    |                    |  4747 |   421K|    18  (12)| 00:00:01 |
|*  2 |   FILTER                          |                    |       |       |            |          |
|*  3 |    CONNECT BY WITH FILTERING      |                    |       |       |            |          |
|*  4 |     FILTER                        |                    |       |       |            |          |
|   5 |      COUNT                        |                    |       |       |            |          |
|   6 |       MERGE JOIN OUTER            |                    |  4747 |   421K|    17   (6)| 00:00:01 |
|   7 |        TABLE ACCESS BY INDEX ROWID| UOS_ORG            |  4747 |   171K|    13   (0)| 00:00:01 |
|   8 |         INDEX FULL SCAN           | PK_UOS_ORG         |  4747 |       |     1   (0)| 00:00:01 |
|*  9 |        SORT JOIN                  |                    |     1 |    54 |     4  (25)| 00:00:01 |
|  10 |         TABLE ACCESS FULL         | UOS_HOLIDAY_SYSTEM |     1 |    54 |     3   (0)| 00:00:01 |
|* 11 |     HASH JOIN                     |                    |       |       |            |          |
|  12 |      CONNECT BY PUMP              |                    |       |       |            |          |
|  13 |      COUNT                        |                    |       |       |            |          |
|  14 |       MERGE JOIN OUTER            |                    |  4747 |   421K|    17   (6)| 00:00:01 |
|  15 |        TABLE ACCESS BY INDEX ROWID| UOS_ORG            |  4747 |   171K|    13   (0)| 00:00:01 |
|  16 |         INDEX FULL SCAN           | PK_UOS_ORG         |  4747 |       |     1   (0)| 00:00:01 |
|* 17 |        SORT JOIN                  |                    |     1 |    54 |     4  (25)| 00:00:01 |
|  18 |         TABLE ACCESS FULL         | UOS_HOLIDAY_SYSTEM |     1 |    54 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------

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

   2 - filter("UHS"."STATE"='10A')
   3 - access("UO"."ORG_ID"=PRIOR "UO"."PARENT_ID")
   4 - filter("UO"."ORG_ID"=1899)
   9 - access("UHS"."ORG_ID"(+)="UO"."ORG_ID")
       filter("UHS"."ORG_ID"(+)="UO"."ORG_ID")
  11 - access("UO"."ORG_ID"=PRIOR "UO"."PARENT_ID")
  17 - access("UHS"."ORG_ID"(+)="UO"."ORG_ID")
       filter("UHS"."ORG_ID"(+)="UO"."ORG_ID")
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       2720  consistent gets
          0  physical reads
          0  redo size
       1129  bytes sent via SQL*Net to client
        481  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
         10  sorts (memory)
          0  sorts (disk)
          0  rows processed
          
         
== 建议改为如下语句:

SELECT UHS.ID,
       UHS.ORG_ID,
       UHS.JOB_ID,
       UHS.HOLIDAY_SYSTEM_NAME,
       UHS.DOWN_FLAG,
       UHS.BEGIN_DATE,
       UHS.END_DATE,
       UHS.STATE,
       UHS.STATE_DATE,
       UHS.CREATE_DATE,
       UHS.OPER_TYPE,
       UHS.COMMENTS,
       UO.ORG_PATH_CODE
  FROM IOPR1.UOS_HOLIDAY_SYSTEM UHS,IOPR1.UOS_ORG UO 
 WHERE UHS.STATE = '10A'  and  UHS.ORG_ID(+) = UO.ORG_ID
 START WITH UO.ORG_ID = 1899
CONNECT BY UO.ORG_ID = PRIOR UO.PARENT_ID
 ORDER BY UO.ORG_PATH_CODE DESC;

Execution Plan
----------------------------------------------------------
Plan hash value: 1668392902

-------------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                    |     1 |    91 |     5  (20)| 00:00:01 |
|   1 |  SORT ORDER BY                   |                    |     1 |    91 |     5  (20)| 00:00:01 |
|*  2 |   FILTER                         |                    |       |       |            |          |
|*  3 |    CONNECT BY WITH FILTERING     |                    |       |       |            |          |
|   4 |     NESTED LOOPS OUTER           |                    |     1 |   128 |     4   (0)| 00:00:01 |
|   5 |      TABLE ACCESS BY INDEX ROWID | UOS_ORG            |     1 |    74 |     1   (0)| 00:00:01 |
|*  6 |       INDEX UNIQUE SCAN          | PK_UOS_ORG         |     1 |       |     1   (0)| 00:00:01 |
|*  7 |      TABLE ACCESS FULL           | UOS_HOLIDAY_SYSTEM |     1 |    54 |     3   (0)| 00:00:01 |
|   8 |     NESTED LOOPS OUTER           |                    |     1 |    91 |     4   (0)| 00:00:01 |
|   9 |      NESTED LOOPS                |                    |       |       |            |          |
|  10 |       CONNECT BY PUMP            |                    |       |       |            |          |
|  11 |       TABLE ACCESS BY INDEX ROWID| UOS_ORG            |     1 |    37 |     1   (0)| 00:00:01 |
|* 12 |        INDEX UNIQUE SCAN         | PK_UOS_ORG         |     1 |       |     1   (0)| 00:00:01 |
|* 13 |      TABLE ACCESS FULL           | UOS_HOLIDAY_SYSTEM |     1 |    54 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------------

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

   2 - filter("UHS"."STATE"='10A')
   3 - access("UO"."ORG_ID"=PRIOR "UO"."PARENT_ID")
   6 - access("UO"."ORG_ID"=1899)
   7 - filter("UHS"."ORG_ID"(+)="UO"."ORG_ID")
  12 - access("UO"."ORG_ID"=PRIOR "UO"."PARENT_ID")
  13 - filter("UHS"."ORG_ID"(+)="UO"."ORG_ID")
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         32  consistent gets
          0  physical reads
          0  redo size
       1129  bytes sent via SQL*Net to client
        481  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          6  sorts (memory)
          0  sorts (disk)
          0  rows processed
 
两者区别:
当前的执行计划是2个表先外连接得到一个较大行源,再根据UO.ORG_ID = 1899筛选数据;
而建议改后的执行计划是首先根据UO.ORG_ID = 1899筛选数据得到一个较小行源,再去跟 UOS_HOLIDAY_SYSTEM做外连接。 最终整体的SQL语句逻辑读由2720降低到32。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值