Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  397 随笔 :: 33 文章 :: 29 评论 :: 0 Trackbacks
DBMS_XPLAN包以及执行计划
 
 
    一直用explain plan来查执行计划,所以想了解一下DBMS_XPLAN包的构成。首先大致了解一下包括的方法:
 
    ■ DISPLAY - 格式化展现plan table中的内容
    ■ DISPLAY_CURSOR - 格式化展现执行计划中的所有载入的游标
    ■ DISPLAY_AWR - 格式化展现执行计划中存储在AWR中的SQL语句.
    ■ DISPLAY_SQLSET - 格式化展现执行计划中存储在SQL优化设置中的语句.
 
    最简单的使用方法是这样的:
    explain plan for (SQL statement);
    select * from table(dbms_xplan.display);
 
    由于输入最后一句的时候比较麻烦,可以建立一个视图来简便操作:
    CREATE VIEW PLAN AS SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
    SELECT * FROM PLAN;
    这样每次都可以方便得渠道最新的一个执行计划
 
 
    看一下自带说明:
-----------------------------------
 create or replace package sys.dbms_xplan AUTHID CURRENT_USER as
 
  --- ------------------------------------------------------------------------
  --- DBMS_XPLAN CONSTANTS SECTION
  --- ------------------------------------------------------------------------
 
  --- The following constants designate the flags returned in the bit vector
  --- from the COMPARE_QUERY_PLANS function.
 
  UNKNOWN_DIFF_CLASS         CONSTANT NUMBER := POWER(2,31);
 
  --- ------------------------------------------------------------------------
  --- DBMS_XPLAN PUBLIC FUNCTIONS SECTION
  --- ------------------------------------------------------------------------
  ---
  --- OVERVIEW
  ---
  ---   This package defines several table functions which can be used to
  ---   display execution plans.
  ---
  ---   - DISPLAY is generally used to display the execution plan produced
  ---             by an EXPLAIN PLAN command; you can either display the most
  ---             recent explained statement, or the statement for a specific
  ---             statement id.
  ---
  ---             In addition, this table function can also be used to display any
  ---             plan (with or without statistics) stored in a table as long
  ---             as the columns of this table are named the same as columns
  ---             of the plan_table (or v$sql_plan_statistics_all if statistics
  ---             are included). A predicate on the specified table can be used
  ---             to select rows of the plan to display.
  ---
  ---   - DISPLAY_CURSOR displays the execution plans for one or several
  ---             cursors in the shared SQL area, depending on a filter
  ---             criteria. It can display the plan for the last executed
  ---             statement, the current (if session is active) or last
  ---             executed statement (if session is inactive) of a specific
  ---             session, or all cursors matching an arbitrary criteria
  ---             defined via SQL. In addition to the explain plan, various
  ---             plan statistics (e.g. io, memory and timing) can be
  ---             reported (based on the v$sql_plan_statistics_all views).
  ---
  ---             Specific cursors are identified by SQL_ID and optionally a
  ---             SQL_CHILD_NUMBER.
  ---
  ---             The DEFAULT without any parameters shows the last executed
  ---             statement of the session.
  ---
  ---             NOTE: To use the DISPLAY_CURSOR functionality, the calling
  ---             user must have SELECT privilege on V$SQL_PLAN_STATISTICS_ALL,
  ---             V$SQL, and V$SQL_PLAN. By default, only the select_catalog
  ---             role has the SELECT privilege on these views.
  ---
  ---   - DISPLAY_AWR displays the execution plans for SQL statements stored in
  ---             the Automatic Workload Repository (AWR).
  ---             NOTE: To use the DISPLAY_AWR functionality, the calling user
  ---             must have SELECT prvilege on DBA_HIST_SQL_PLAN and
  ---             DBA_HIST_SQLTEXT. By default, select privilige for these
  ---             views is granted to the select_catalog role.
  ---
  ---   - DISPLAY_SQLSET displays the execution plans for SQL statements stored
  ---             in a SQL tuning set.
  ---             NOTE: To use the DISPLAY_SQLSET functionality, the calling
  ---             user must have SELECT prvilege on ALL_SQLSET_PLANS and
  ---             ALL_SQLSET_STATEMENTS. By default, select privilige for these
  ---             views is granted to the public role.
  ---
  ---
  ---   For example:
  ---     To show the last explained statement
  ---        explain plan for select ename, deptno
  ---                         from emp e, dept d
  ---                         where e.deptno = d.deptno;
  ---        select * from table(dbms_xplan.display);
  ---
  ---     To show the last executed statement of your session
  ---        select * from table(dbms_xplan.display_cursor);
  ---
  ---     See more detailed examples below
  ---
  --- SECURITY
  ---
  ---   The execution privilege on this package is granted to PUBLIC.
  ---   The display procedures of this package run under the caller
  ---   security.
  ---
  ---
  --- PROCEDURES AND FUNCTIONS
  ---
  ---   function display(table_name   varchar2 default 'PLAN_TABLE',
  ---                    statement_id varchar2 default null,
  ---                    format       varchar2 default 'TYPICAL',
  ---                    filter_preds varchar2 default null)
  ---
  ---   - table_name:
  ---        specifies the table name where the plan is stored. This
  ---        parameter defaults to "PLAN_TABLE" which is the default
  ---        plan table for the explain plan. If NULL is specified,
  ---        the default of 'PLAN_TABLE' will be taken into account.
  ---        The parameter is case insensitive.
  ---
  ---   - statement_id:
  ---        specifies the statement id of the plan to display. This
  ---        parameter defaults to NULL. If no statement_id is defined,
  ---        the most recent explained statement in <table_name> will
  ---        be displayed, assuming that the "filter_preds" parameter is
  ---        NULL (its default).
  ---
  ---   - format:
  ---        Determines what information stored in the plan will be
  ---        shown. The format string can use the following predefined
  ---        three formats, each representing a common use case:
  ---
  ---        'BASIC':   Display only the minimum set of information, i.e. the
  ---                   operation id, the operation name and its option
  ---
  ---        'TYPICAL': This is the default. Display most information
  ---                   of the explain plan (operation id, name and option,
  ---                   #rows, #bytes and optimizer cost). Pruning,
  ---                   parallel and predicate information are only
  ---                   displayed when applicable. Excludes only PROJECTION,
  ---                   ALIAS and REMOTE SQL information (see below).
  ---
  ---        'ALL':     Maximum user level, like typical with additional
  ---                   informations (PROJECTION, ALIAS and information about
  ---                   REMOTE SQL if the operation is distributed).
  ---
  ---        For finer control on the display output, the following keywords
  ---        can be added to the above three standard format to customize their
  ---        default behavior. Each keyword either represents a logical group
  ---        of plan table columns (e.g. PARTITION) or logical additions to the
  ---        base plan table output (e.g. PREDICATE). Format keywords must
  ---        be separated by either a comma or a space:
  ---
  ---        ROWS: if relevant, shows number of rows estimated by the optimizer
  ---
  ---        BYTES: if relevant, shows number of bytes estimated by the
  ---               optimizer
  ---
  ---        COST: if relevant, shows optimizer cost information
  ---
  ---        PARTITION: If relevant, shows partition pruning information
  ---
  ---        PARALLEL: If relevant, shows PX information (distribution method
  ---                  and table queue information)
  ---
  ---        PREDICATE: If relevant, shows the predicate section
  ---
  ---        PROJECTION: If relevant, shows the projection section
  ---
  ---        ALIAS: If relevant, shows the "Query Block Name / Object Alias"
  ---               section
  ---
  ---        REMOTE: If relevant, shows the information for distributed query
  ---                (e.g. remote from serial distribution and remote SQL)
  ---
  ---        NOTE: If relevant, shows the note section of the explain plan.
  ---
  ---      Format keywords can be prefixed by the sign '-' to exclude the
  ---      specified information. For example, '-PROJECTION' exclude
  ---      projection information.
  ---
  ---      Finally, if the target plan table (see "table_name" parameter) also
  ---      stores plan statistics columns (e.g. it is a table used to capture
  ---      the content of the fixed view v$sql_plan_statistics_all), then
  ---      additional format keywords can be used to specify which class of
  ---      statistics to display. These additionnal format keywords are IOSTATS,
  ---      MEMSTATS, ALLSTATS and LAST described along with the display_cursor()
  ---      table function (see below).
  ---
  ---      Example:
  ---        - use 'ALL -PROJECTION -NOTE' to display everything except the
  ---          projection and note sections.
  ---
  ---        - use 'TYPICAL PROJECTION' to display using the typical format
  ---          with the additional projection section (which is normally excluded
  ---          under the typical format). Since typical is default, using
  ---          simply 'PROJECTION' is equivalent.
  ---
  ---        - use '-BYTES -COST -PREDICATE' to display using the typical
  ---         format but excluding optimizer cost and byte estimates
  ---         as well as the predicate section.
  ---
  ---        - use 'BASIC ROWS' to display basic information with the
  ---          additional number of rows estimated by the optimizer.
  ---
  ---
  ---   - filter_preds: SQL filter predicate(s) to restrict the set of rows
  ---                   selected from the table where the plan is stored. When
  ---                   value is NULL (the default), the plan displayed
  ---                   corresponds to the last executed explain plan.
  ---
  ---                   For example:
  ---
  ---                     filter_preds=>'plan_id = 10'
  ---
  ---                   "filter_preds" can reference any column of the table
  ---                   where the plan is stored and can contain any SQL
  ---                   construct (e.g. sub-query, function calls...).
  ---
  ---                   WARNING: Application developers should expose this
  ---                   parameter to end-users only after careful
  ---                   consideration since it could expose the application
  ---                   to SQL injection. Indeed, "filter_preds" can
  ---                   potentially reference any table or execute any server
  ---                   function for which the database user invoking the
  ---                   table function has privileges.
  ---
  ---
  ---   function display_cursor(sql_id           varchar2 default null,
  ---                           cursor_child_no  integer default 0,
  ---                           format           varchar2 default 'TYPICAL')
  ---
  ---   - sql_id:
  ---        specifies the sql_id value for a specific SQL statement, as
  ---        shown in V$SQL.SQL_ID, V$SESSION.SQL_ID, or
  ---        V$SESSION.PREV_SQL_ID. If no sql_id is specified, the last
  ---        executed statement of the current session is shown.
  ---
  ---   - cursor_child_no:
  ---        specifies the child number for a specific sql cursor, as shown in
  ---        V$SQL.CHILD_NUMBER or in V$SESSION.SQL_CHILD_NUMBER,
  ---        V$SESSION.PREV_CHILD_NUMBER. This input parameter is only
  ---        considered when sql_id is set.
  ---
  ---        If not specified, all child cursors for the specified sql_id are
  ---        displayed.
  ---
  ---   - format:
  ---        The format string has the same meaning than for the regular
  ---        display() table function (see format description above). In
  ---        addition, the following four format keywords are introduced
  ---        to support the various plan statistics columns available
  ---        in v$sql_plan_statistics_all.
  ---
  ---        These keywords can also be used by the display() table function
  ---        assuming that the specified table has the same statistics columns
  ---        available in v$sql_plan_statistics_all.
  ---
  ---        IOSTATS: Assuming that basic plan statistics are
  ---                 collected when SQL statements are executed (either by
  ---                 using the gather_plan_statistics hint or by setting the
  ---                 parameter statistics_level to ALL), this format will show
  ---                 IO statistics for all (or only for the last as shown below)
  ---                 executions of the cursor.
  ---
  ---        MEMSTATS: Assuming that PGA memory management is enabled (i.e
  ---                  pga_aggregate_target parameter is set to a non 0 value),
  ---                  this format allows to display memory management
  ---                  statistics (e.g. execution mode of the operator, how
  ---                  much memory was used, number of bytes spilled to
  ---                  disk, ...). These statistics only apply to memory
  ---                  intensive operations like hash-joins, sort or some bitmap
  ---                  operators.
  ---
  ---        ALLSTATS: A shortcut for 'IOSTATS MEMSTATS'
  ---
  ---        LAST: By default, plan statistics are shown for all executions of
  ---              the cursor. The keyword LAST can be specified to see only
  ---              the statistics for the last execution.
  ---
  ---
  ---        Also, the following two formats are still supported for backward
  ---        compatibility:
  ---
  ---        'RUNSTATS_TOT':  Same as 'IOSTATS', i.e. displays IO statistics
  ---                         for all executions of the specified cursor.
  ---        'RUNSTATS_LAST': Same as 'IOSTATS LAST', i.e. displays the runtime
  ---                         statistics for the last execution of the cursor.
  ---
  ---
  ---   PRIVILEGES:
  ---   -    To use the DISPLAY_CURSOR functionality, the calling
  ---        user must have SELECT privilege on V$SQL_PLAN_STATISTICS_ALL,
  ---        V$SQL, and V$SQL_PLAN, otherwise it will show an appropriate
  ---        error message.
  ---
  ---   -    Unless used in DEFAULT mode to display the last executed
  ---        statement, all internal SQL statements of this package and
  ---        the calling SQL statement using this table function will be
  ---        suppressed.
  ---
  ---
  ---   function display_awr(sql_id          varchar2,
  ---                        plan_hash_value integer  default null,
  ---                        db_id           integer  default null,
  ---                        format          varchar2 default 'TYPICAL')
  ---
  ---   - sql_id:
  ---        specifies the sql_id value for a SQL statement having its plan(s)
  ---        stored in the AWR. You can find all stored SQL statements by
  ---        querying DBA_HIST_SQL_PLAN.
  ---
  ---   - plan_hash_value:
  ---        identifies a specific stored execution plan for a SQL statement.
  ---        Optional parameter. If suppressed, all stored execution plans are
  ---        shown.
  ---
  ---   - db_id:
  ---        identifies the plans for a specific dabatase. If this parameter is
  ---        omitted, it will be defaulted to the local database identifier.
  ---
  ---   - format:
  ---        The format string has the same meaning than for the regular
  ---        display() table function (see format description above).
  ---
  ---
  ---   function display_sqlset(sqlset_name     varchar2,
  ---                           sql_id          varchar2,
  ---                           plan_hash_value integer  default null,
  ---                           format          varchar2 default 'TYPICAL',
  ---                           sqlset_owner    varchar2 default null)
  ---
  ---   - sqlset_name:
  ---        specified the name of the SQL tuning set.
  ---
  ---   - sql_id:
  ---        specifies the sql_id value for a SQL statement having its plan(s)
  ---        stored in the SQL tuning set. You can find all stored SQL
  ---        statements by querying USER/DBA/ALL_SQLSET_PLANS or table function
  ---        SELECT_SQLSET from package dbms_sqltune.
  ---
  ---   - plan_hash_value:
  ---        identifies a specific stored execution plan for a SQL statement.
  ---        Optional parameter. If suppressed, all stored execution plans are
  ---        shown.
  ---
  ---   - format:
  ---        The format string has the same meaning than for the regular
  ---        display() table function (see format description above).
  ---
  ---   - sqlset_owner:
  ---        Specifies the owner of the SQL tuning set. The default is the
  ---        name of the current user.
  ---
  ---
  ---   Examples DBMS_XPLAN.DISPLAY():
  ---
  ---   1/ display the last explain plan stored in the plan table:
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select * from table(dbms_xplan.display);
  ---
  ---
  ---   2/ display from the plan table "my_plan_table":
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select * from table(dbms_xplan.display('my_plan_table'));
  ---
  ---
  ---   3/ display minimum plan table:
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select * from table(dbms_xplan.display(null, null,'basic'));
  ---
  ---
  ---   4/ display all information in plan table, excluding projection:
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select * from table(dbms_xplan.display(null, null,
  ---                                             'all -projection'));
  ---
  ---
  ---   5/ display the plan whose statement_id is 'foo':
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select * from table(dbms_xplan.display('plan_table', 'foo'));
  ---
  ---
  ---   6/ display statpack plan for hash_value=76725 and snap_id=245
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select * from table(dbms_xplan.display('stats$sql_plan', null,
  ---                          'all', 'hash_value=76725 and snap_id=245'));
  ---
  ---
  ---   Examples DBMS_XPLAN.DISPLAY_CURSOR():
  ---
  ---   1/ display the currently or last executed statement
  ---      (this will also show the usage of this package)
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select * from table(dbms_xplan.display_cursor);
  ---
  ---
  ---   2/ display the currently or last executed statement of session id 9
  ---      (it will return 'no rows selected' for any SQL statement using
  ---       this package)
  ---
  ---    - Identify the sql_id and the child_number in
  ---      a separate SQL statement and use them as parameters for
  ---      DISPLAY_CUSRSOR()
  ---
  ---      SQL> select prev_sql_id, prev_child_number
  ---           from v$session where sid=9;
  ---
  ---      PREV_SQL_ID   PREV_CHILD_NUMBER
  ---      ------------- -----------------
  ---      f98t6zufy04g5                 0
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select *
  ---      from table(dbms_xplan.display_cursor('f98t6zufy04g5', 0));
  ---
  ---    - Alternatively, you can combine the two statements into one
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select t.*
  ---      from v$session s,
  ---           table(dbms_xplan.display_cursor(s.prev_sql_id,
  ---                                           s.prev_child_number)) t
  ---      where s.sid=9;
  ---
  ---      NOTE: the table deriving the input parameters for
  ---            DBMS_XPLAN.DISPLAY_CURSOR() must be the FIRST (left-side)
  ---            table(s) in the select statement relative to the table function
  ---
  ---
  ---   3/ display all cursors containing the case sensisitve string 'FoOoO',
  ---      excluding SQL parsed by SYS
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select t.*
  ---      from v$sql s,
  ---           table(dbms_xplan.display_cursor(s.sql_id,
  ---                                           s.child_number)) t
  ---      where s.sql_text like '%FoOoO%' and s.parsing_user_id <> 0;
  ---
  ---
  ---   4/ display all information about all cursors containing the case
  ---      insensitive string 'FOO', including SQL parsed by SYS
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select t.*
  ---      from v$sql s,
  ---           table(dbms_xplan.display_cursor(s.sql_id,
  ---                                           s.child_number, 'ALL')) t
  ---      where upper(s.sql_text) like '%FOO%';
  ---
  ---
  ---   5/ display the last executed runtime statistics for all cursors
  ---      containing the case insensitive string 'sales', including SQL
  ---      parsed by SYS
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select t.*
  ---      from v$sql s,
  ---           table(dbms_xplan.display_cursor(s.sql_id, s.child_number,
  ---                                           'ALLSTATS LAST')) t
  ---      where lower(s.sql_text) like '%sales%';
  ---
  ---
  ---   6/ display the aggregated runtime statistics for all cursors containing
  ---      the case sensitive string 'sAleS' and were parsed by user SH
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select t.*
  ---      from v$sql s, dba_users u,
  ---           table(dbms_xplan.display_cursor(s.sql_id, s.child_number,
  ---                                           'RUNSTATS_TOT')) t
  ---      where s.sql_text like '%sAleS%'
  ---      and u.user_id=s.parsing_user_id
  ---      and u.username='SH';
  ---
  ---   Examples DBMS_XPLAN.DISPLAY_AWR():
  ---
  ---   1/ display all stored plans in the AWR containing
  ---      the case sensitive string 'sAleS'. Don't display predicate
  ---      information but add the query block name / alias section.
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select t.*
  ---      from dba_hist_sqltext ht,
  ---           table(dbms_xplan.display_awr(ht.sql_id, null, null,
  ---                                        '-PREDICATE +ALIAS')) t
  ---      where ht.sql_text like '%sAleS%';
  ---
  ---      NOTE: the table deriving the input parameters for
  ---            DBMS_XPLAN.DISPLAY_AWR() must be the FIRST (left-side)
  ---            table(s) in the select statement relative to the table
  ---            function.
  ---
  ---   Examples DBMS_XPLAN.DISPLAY_SQLSET():
  ---
  ---   1/ display all stored plans for a given statement in the SQL tuning set
  ---       named 'my_sts' owner by the current user (the caller).
  ---
  ---      set linesize 150
  ---      set pagesize 2000
  ---      select *
  ---      from table(dbms_xplan.display_sqlset('my_sts',
  ---                                           'gcfysssf6hykh',
  ---                                            null,
  ---                                           'ALL -NOTE -PROJECTION')) t
  ---
  --- -------------------------------------------------------------------------
 
  -- display from PLAN_TABLE
  function display(table_name   varchar2      default 'PLAN_TABLE',
                   statement_id varchar2      default null,
                   format       varchar2      default 'TYPICAL',
                   filter_preds varchar2      default null)
  return dbms_xplan_type_table
  pipelined;
 
  -- display from V$SQL_PLAN (or V$SQL_PLAN_STATISTICS_ALL)
  function display_cursor(sql_id           varchar2 default  null,
                          cursor_child_no  integer  default  0,
                          format           varchar2 default  'TYPICAL')
  return dbms_xplan_type_table
  pipelined;
 
  -- display from AWR
  function display_awr(sql_id          varchar2,
                       plan_hash_value integer  default null,
                       db_id           integer  default null,
                       format          varchar2 default 'TYPICAL')
  return dbms_xplan_type_table
  pipelined;
 
  -- display from SQL tuning set
  function display_sqlset(sqlset_name     varchar2,
                          sql_id          varchar2,
                          plan_hash_value integer  default null,
                          format          varchar2 default 'TYPICAL',
                          sqlset_owner    varchar2 default null)
  return dbms_xplan_type_table
  pipelined;
 
  -- private procedure, used internally
  function  prepare_records(plan_cur        IN sys_refcursor,
                            i_format_flags  IN binary_integer)
  return dbms_xplan_type_table
  pipelined;
 
  -- private function to validate the user format (used internally)
  function validate_format(hasPlanStats  IN  boolean,
                           format        IN  VARCHAR2,
                           format_flags  OUT BINARY_INTEGER)
  return boolean;
 
end dbms_xplan; 

-----------------------------------------------

 
 
下面是执行计划中各个字段的含义,再明确一下:
----------------------------------------
■ ROWS - if relevant, shows the number of rows estimated by theoptimizer
■ BYTES - if relevant, shows the number of bytes estimated bythe optimizer
■ COST - if relevant, shows optimizer cost information
■ PARTITION - if relevant, shows partition pruning information
■ PARALLEL - if relevant, shows PX information (distributionmethod and table queue information)
■ PREDICATE - if relevant, shows the predicate section
■ PROJECTION -if relevant, shows the projection section
■ ALIAS - if relevant, shows the "Query Block Name / ObjectAlias" section
■ REMOTE - if relevant, shows the information for distributedquery (for example, remote from serial distribution and remoteSQL)
■ NOTE - if relevant, shows the note section of the explain planFormat keywords can be prefixed by the sign '-' to exclude thespecified information. For example, '-PROJECTION' excludesprojection information.
 
 
 
    关于DBMS_XPLAN包的几个方法的用法,在注释里已经讲得很清楚了,而且还带了比较详细的举例,基本上只要看一遍就会了。不过关键是这个包怎么用,怎么看执行计划等问题,这就涉及到SQL tuning等一些别的问题了。
 
 
posted on 2009-06-08 21:32 decode360 阅读(1208) 评论(0)  编辑  收藏 所属分类: 06.PLSQL

只有注册用户登录后才能发表评论。


网站导航: