zoukankan      html  css  js  c++  java
  • Oracle执行计划

      建立与oracle的web程序,经常性出现sql性能不高导致的问题,比如程序好好的突然数据库查询变得很慢,几乎加载不了,这时候就有可能是oracle查询计划出错的原因。

     1 <sql id="queryCalendarBySeqnos">
     2         
     3        SELECT * FROM(     
     4        select /*+ leading(ii) index(ii CALENDAR_INVITE_IDX1) */ ii.RECMYSMS,ii.RECMYEMAIL,ii.RECMOBILE,ii.RECEMAIL,ii.enable,ii.status,
     5        case(ii.inviteauth) when -1 then 0 else 1 end as isInvitedCalendar,
     6        0 as isSharedCalendar,
     7        0 as isSubCalendar,
     8        nvl(l.labelname,sl.labelname) as labelname,
     9        nvl(l.color,sl.color) as color,
    10        nvl(l.gid,sl.gid) as lableGid,
    11        i.createtime,
    12        <include refid="calendarInfoColumnNamesForSelf"/>
    13        FROM calendar_info i, calendar_invite_info ii,
    14        calendar_label l,calendar_sys_label sl
    15        WHERE 
    16        i.seqno = ii.calseqno
    17        and i.labelid = l.seqno(+) 
    18        and i.labelid = sl.seqno(+)
    19        AND ii.inviteruin = #uin#
    20        and i.isdelflag = 0
    21        and ii.isdelflag = 0
    22        <![CDATA[
    23        AND ii.status <> 2
    24         ]]>
    25        AND i.seqno in 
    26        <iterate property="gids" open="(" close=")" conjunction=",">  
    27                #gids[]#  
    28         </iterate>
    29        
    30        UNION ALL 
    31        
    32        select /*+ leading(ls) index(ls CALENDAR_LABEL_SHARE_IDX2) */ 0 as RECMYSMS,0 as RECMYEMAIL,'' as RECMOBILE,'' as RECEMAIL,0 as enable,1,
    33        0 as isInvitedCalendar,
    34        1 as isSharedCalendar,
    35        0 as isSubCalendar,
    36        l.labelname,ls.color,
    37        l.gid as lableGid,
    38        i.createtime,
    39        <include refid="calendarInfoColumnNames"/>
    40       from calendar_info i, calendar_label_share_info ls,
    41       calendar_label l
    42       <![CDATA[
    43       where 
    44       i.labelid = ls.labelid
    45       and i.labelid = l.seqno
    46       and ls.sharetype <> -1
    47       and ls.shareuin = #uin#
    48       and ls.status = 1
    49       and i.isdelflag = 0
    50 
    51        ]]>
    52       AND i.seqno in
    53         <iterate property="gids" open="(" close=")" conjunction=",">  
    54                #gids[]#  
    55         </iterate>
    56        
    57        
    58        UNION ALL 
    59        
    60        select /*+ leading(cs) index(cs UNI_CALENDAR_SUBSCRIPTION) */ 0 as RECMYSMS,0 as RECMYEMAIL,'' as RECMOBILE,'' as RECEMAIL,0 as enable,1,
    61        0 as isInvitedCalendar,
    62        0 as isSharedCalendar,m
    63        1 as isSubCalendar,
    64        l.labelname,cs.color,
    65        l.gid as lableGid,
    66        i.createtime,
    67        <include refid="calendarInfoColumnNames"/>
    68       from calendar_info i, calendar_subscription cs,
    69       calendar_label l
    70       <![CDATA[
    71       where 
    72       i.labelid = cs.labelid
    73       and i.labelid = l.seqno
    74       and cs.uin=#uin#
    75       and l.isPublic=1
    76       and i.isdelflag = 0
    77        ]]>
    78       AND i.seqno in
    79         <iterate property="gids" open="(" close=")" conjunction=",">  
    80                #gids[]#  
    81         </iterate>
    82        )
    83     </sql>
    View Code

    如上图的代码,就出现了问题。

    所以学一下oracle的查询计划吧。

    1、设置oracle查询计划,如下步骤:

    2、在sql-plus查询sql的执行计划,如图:

    SQL> explain plan for select count(*) from   calendar01.calendar_label@to_calendar.LOCALDOMAIN  where    istodoemail =1  and color <>'#f2b73a';
     
    Explained
     
    SQL> 
    SQL> 
    SQL> 
    SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
     
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------
    Plan hash value: 4083529702
    --------------------------------------------------------------------------------
    | Id  | Operation              | Name           | Rows  | Bytes | Cost (%CPU)| T
    --------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT REMOTE|                |     1 |    21 |     6   (0)| 0
    |   1 |  SORT AGGREGATE        |                |     1 |    21 |            |
    |*  2 |   TABLE ACCESS FULL    | CALENDAR_LABEL |    12 |   252 |     6   (0)| 0
    --------------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       2 - filter("A1"."ISTODOEMAIL"=1 AND "A1"."COLOR"<>'#f2b73a')
    Note
    -----
       - fully remote statement
     
    18 rows selected
     
    SQL> 

     我们需要掌握它的执行先后顺序和每个字段代表的含义。

     执行计划的执行顺序为: 
    先从计划开头一直往右看,直到最右边并列的代码部分,如果见到并列的,就从上往下看,对于并列的步骤,靠上的先执行,对于不并列的步骤,靠右的先执行
     

    中文参照:http://www.cnblogs.com/kerrycode/archive/2012/05/24/2517210.html

    英文参照:http://perumal.org/how-to-read-an-oracle-sql-execution-plan/

  • 相关阅读:
    常见错误--06.18
    类目-延展-协议
    iOS页面传值-wang
    ios常见的页面传值方式
    delegate和protocol
    沙盒路径及文件 操作
    tableView优化性能
    IOS面试题
    浅谈Runloop
    面试题
  • 原文地址:https://www.cnblogs.com/wanghongye/p/5047422.html
Copyright © 2011-2022 走看看