SQL优化-2 查看执行计划

一、得到执行计划 ,方法很多,我常用的有两种:

1.explain plan for + 要执行的SQL语句。执行完后,可以通过这种方式来得到:select *  from table(dbms_xplan.display).虽然这样的version比较老点,但是查看还是很方便的,省了很多设置。

2.建立plan_table表,安装oracle时已经提供了建表语句:这里给出建表语句:

create table PLAN_TABLE (
        statement_id       varchar2(30),
        plan_id            number,
        timestamp          date,
        remarks            varchar2(4000),
        operation          varchar2(30),
        options            varchar2(255),
        object_node        varchar2(128),
        object_owner       varchar2(30),
        object_name        varchar2(30),
        object_alias       varchar2(65),
        object_instance    numeric,
        object_type        varchar2(30),
        optimizer          varchar2(255),
        search_columns     number,
        id                 numeric,
        parent_id          numeric,
        depth              numeric,
        position           numeric,
        cost               numeric,
        cardinality        numeric,
        bytes              numeric,
        other_tag          varchar2(255),
        partition_start    varchar2(255),
        partition_stop     varchar2(255),
        partition_id       numeric,
        other              long,
        distribution       varchar2(30),
        cpu_cost           numeric,
        io_cost            numeric,
        temp_space         numeric,
        access_predicates  varchar2(4000),
        filter_predicates  varchar2(4000),
        projection         varchar2(4000),
        time               numeric,
        qblock_name        varchar2(30),
        other_xml          clob
);

       在我电脑中路径是这样的:E:/oracle/product/10.2.0/db_1/RDBMS/ADMIN/utlxplan.sql,具体到实际的机器上由安装路径和操作系统而定。还是通过执行explain plan for 'sql语句',然后select 上表即可。

3.利用第三方工具:PL/SQL developer ,TOAD for oracle 等。

二 、执行计划的阅读规则:最右最上原则。

给出一个例子:

explain plan for SELECT 0,   --ID
               A.aab001,   --单位编号
               E.aab004,   --单位名称
               A.aac001,   --个人编号
               B.aac003,   --个人姓名
               B.aac002,   --身份证号
               A.aka130,   --医疗类别
               C.akb021,   --定点机构名称
               D.akc192,   --入院日期
               D.akc194,   --出院日期
               A.akc261,   --个人账户支付
               A.aae040,   --消费日期
               A.akc190 
          FROM kc24 A,KC21 D ,ac01 B,ab01 E,t_kb01 C   --个人消费明细信息
          WHERE     A.akb020=D.akb020
          AND       A.akc190=D.akc190
          AND       A.aac001=D.aac001
          AND       A.aac001=B.aac001
          AND       A.aab001=E.aab001
          AND       A.akb020=C.akb020;
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
| Id  | Operation                | Name                | Rows  | Bytes | Cost (%
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |                     |   281 | 47770 |   840
|*  1 |  HASH JOIN               |                     |   281 | 47770 |   840
|*  2 |   HASH JOIN              |                     |   281 | 40464 |   819
|   3 |    TABLE ACCESS FULL     | T_KB01              |   721 | 19467 |     5
|*  4 |    HASH JOIN             |                     |   282 | 32994 |   813
|*  5 |     HASH JOIN            |                     |   677 | 57545 |   762
|   6 |      INDEX FAST FULL SCAN| INDEX_KC21_SUN      |   677 | 27080 |     4
|   7 |      TABLE ACCESS FULL   | KC24                |   144K|  6358K|   756
|   8 |     INDEX FAST FULL SCAN | IND_AC01_FAST_QUERY | 13364 |   417K|    50
|   9 |   INDEX FAST FULL SCAN   | IND_AB01_FAST_QUERY |  5536 |   140K|    20
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("E"."AAB001"=TO_NUMBER("A"."AAB001"))
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
   2 - access("A"."AKB020"="C"."AKB020")
   4 - access("B"."AAC001"=TO_NUMBER("A"."AAC001"))
   5 - access("A"."AKB020"="D"."AKB020" AND "A"."AKC190"="D"."AKC190" AND
              "A"."AAC001"="D"."AAC001")
Note
-----
   - 'PLAN_TABLE' is old version
 
28 rows selected
我还是比较钟情于这样的方式,因为从plan_table查出的没有这样来的直接。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值