ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle执行计划

Oracle执行计划

原创 Linux操作系统 作者:qiushentan 时间:2011-04-26 22:30:44 0 删除 编辑

1.什么叫做SQL执行计划?
      一个SQL语句表示你想要从数据库服务器中得到的结果,但是数据库服务器收到这条SQL的时候,一开始并不是马上解析它,如果这条SQL没有语法错误,数据库服务器才会继续工作,并且选择最好的计算方式,如果你是查询一张表的话,服务器会选择一下是读取整张表呢还是利用索引,那种执行效率好就会选择哪种!最终SQL语句被物理性执行的方法被称作执行计划!
        一个执行计划由若干基本操作组成,负责处理或计算出最优的执行计划的DB Server组件叫做优化器,优化器是建立在其所在的DB资源的基础上进行工作的。
       数据库服务器在执行SQL语句之前会定制几套执行计划!看哪个执行计划消耗的系统资源少就用哪套执行计划!被数据库服务器执行的那套执行计划就叫做SQL语句的执行计划!

2.不借助第三方工具,怎样查看SQL的执行计划?

    首先,创建一个叫做Plustrace的角色,具体创建过程如下:

   因为我的Oracle装在E盘下,所以在路径E:\oracle\product\10.1.0\Db_1\sqlplus\admin的目录下找到plustrce.sql文件,文件内容自己可以以记事本的方式打开看。然后以管理员的身份登录到SQL命令窗口,在命令窗口运行该文件 SQL> @ E:\oracle\product\10.1.0\Db_1\sqlplus\admin\plustrce.sql  效果如下:

 SQL> drop role plustrace;

  角色已删除。

  SQL> create role plustrace;

  角色已创建。

  SQL>
  SQL> grant select on v_$sesstat to plustrace;

  授权成功。

  SQL> grant select on v_$statname to plustrace;

  授权成功。

  SQL> grant select on v_$mystat to plustrace;

  授权成功。

  SQL> grant plustrace to dba with admin option;

  授权成功。

  SQL>
  SQL> set echo off

当然,你可以将该角色的权限授予给其他用户
其次,创建一个plan_table表,用来存储分析SQL语句的结果,可以在路径 E:\oracle\product\10.1.0\Db_1\RDBMS\ADMIN下找到 utlxplan.sql,这个文件就是用来创建plan_table表的SQL语句。

 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)
);

在SQL命令窗口中运行该文件 SQL> @  E:\oracle\product\10.1.0\Db_1\RDBMS\ADMIN\utlxplan.sql这样存储分析SQL语句结果的表就建成了。如果现在在SQL命令窗口中执行一条SQL语句的话,我们会发现还是看不到执行计划的!因为我们有几个回显参数没有设定!

set   time   on; (说明:打开时间显示)
set   autotrace   on; (说明:打开自动分析统计,并显示SQL语句的运行结果)
set   autotrace   traceonly; (说明:打开自动分析统计,不显示SQL语句的运行结果)

所以我们在SQL命令窗口 set autotrace on 或 set autotrace traceonly 时,我们才能看到SQL语句的执行计划和统计信息!

例如在我的system用户模式下有表员工表 e,我执行 SELECT * FROM SYSTEM.e ,将得到如下返回信息:

EID        ENAME      SEX        ID
---------- ---------- ---------- ----------
001        赵1        男         yy
002        钱2        男         02
003        孙3        男         03
004        李4        女         04
005        周5        女         55


执行计划
----------------------------------------------------------
Plan hash value: 3822424092

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     5 |   185 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| E    |     5 |   185 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------


统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          4  consistent gets
          0  physical reads
          0  redo size
        784  bytes sent via SQL*Net to client
        373  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          5  rows processed

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25687134/viewspace-693825/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2011-04-14

  • 博文量
    1
  • 访问量
    1052