`

(转)查看执行计划

 
阅读更多

Oracle10g获取sql语句的执行计划详解
  ---
  Oracle诊断或调优经常需要做的就是查看SQL语句的执行计划,很多时候我们需要得到sql语句在不同场景、不同时间段的执行计划。  

 
  一,通过explain plan命令获得sql语句的执行计划。
  explain plan的命令格式如下: 
  sql>Explain plan <set statement_id = ‘text’> <into your plan table> for sql statement;
  蓝色部分(<>中)可以省略;红色部分为具体sql语句 
  "set statement_id = ‘text’” ,其中statement_id是plan_table.statement_id,标记该条sql的id信息; 
  "into your plan table”,默认的plan table是plan_table
  例如:
   SQL> Explain plan set statement_id = 'dd' into plan_table for select * from cmdba.cmcdms t where t.code_item_no='031' and t.code='1B';
  已解释。
  通过explain plan command获得sql语句的执行计划,最大的优点是不用直接运行sql语句,避免了由于返回结果时间过长过多带来的等待。
 
  二,Oracle10g平台以上获取sql语句的执行计划的方法有很多种,大致列举如下:

  0,通过PL/SQL查看
  打开SQLWINDOW,输入sql语句,按F5可以看到它的执行计划,但是这里没有物理读等统计信息。
 
  1,通过plan_table查看
  1) 需要先运行@$ORACLE_HOME/rdbms/admin/utlxpls.sql语句,生成plan_table.
  2) 执行explain plan命令获得sql语句的执行计划。
   SQL> Explain plan set statement_id = 'dd' into plan_table for select * from cmdba.cmcdms t where t.code_item_no='031' and t.code='1B';
  注意,执行完成后要提交,才能在plan_table中查看到。
  提交后,在PLAN_Table中可以查看到相关的记录。
  3)查看sql执行计划:select * from plan_table where statement_id='dd'
 
  2,使用dbms_xplan.display_cursor包从v$sql_plan里查看sql语句的执行计划。
  sql命令如下: 
  sql>select plan_table_output from table(dbms_xplan.display_cursor(‘sql_id’));
  注意:sql_id可以通过v$sql 视图获得。另外,v$sql_plan_statistics_all记录着sql语句的统计信息,也可以结合该视图查看到历史sql的执行计划。
  如查询上述sql语句的sql_ID:select sql_id from v$Sql where sql_text like 'select * from cmdba.cmcdms t where t.code_item_no=%'
  得到sql_id=4skqqxzg5qkz9,查询执行计划:
  SQL> select plan_table_output from table(dbms_xplan.display_cursor('4skqqxzg5qkz9'));
  PLAN_TABLE_OUTPUT
  --------------------------------------------------------------------------------
  SQL_ID  4skqqxzg5qkz9, child number 0
  -------------------------------------
  select * from cmdba.cmcdms t where t.code_item_no='031' and t.code='1B'
  Plan hash value: 3600018637
  --------------------------------------------------------------------------------
  | Id  | Operation                   | Name      | Rows  | Bytes | Cost (%CPU)| T
  --------------------------------------------------------------------------------
  |   0 | SELECT STATEMENT            |           |       |       |     2 (100)|
  |   1 |  TABLE ACCESS BY INDEX ROWID| CMCDMS    |     1 |    71 |     2   (0)| 0
  |*  2 |   INDEX UNIQUE SCAN         | PK_CMCDMS |     1 |       |     1   (0)| 0
  --------------------------------------------------------------------------------
  Predicate Information (identified by operation id):
  ---------------------------------------------------
  2 - access("T"."CODE_ITEM_NO"='031' AND "T"."CODE"='1B')
  19 rows selected
 
  3,直接在V$Sql_plan中查看执行计划:
  同样也需要在v$sql 视图中查询出sql_id。
  然后通过sql_id查询执行计划:
  select * from V$SQL_PLAN where sql_id='4skqqxzg5qkz9'
 
  4,使用dbms_xplan包 ,这里跟F5差不多,也是没有一些统计信息
  Oracle9i新引入的包dbms_xplan
  Oracle9i新引入的包dbms_xplan。函数display有三个参数:Table_name——执行计划所存放的表,默认为PLAN_TABLE;STATEMENT_ID——PLAN_TABLE表中的字段;FORMAT——显示格式。
 
  SQL> explain plan for select * from cmdba.cmcdms t where t.code_item_no='031' and t.code='1B';
 
  Explained
 
  SQL> select * from table(dbms_xplan.display);
 
  PLAN_TABLE_OUTPUT
  --------------------------------------------------------------------------------
  Plan hash value: 3600018637
  --------------------------------------------------------------------------------
  | Id  | Operation                   | Name      | Rows  | Bytes | Cost (%CPU)| T
  --------------------------------------------------------------------------------
  |   0 | SELECT STATEMENT            |           |     1 |    71 |     2   (0)| 0
  |   1 |  TABLE ACCESS BY INDEX ROWID| CMCDMS    |     1 |    71 |     2   (0)| 0
  |*  2 |   INDEX UNIQUE SCAN         | PK_CMCDMS |     1 |       |     1   (0)| 0
  --------------------------------------------------------------------------------
  Predicate Information (identified by operation id):
  ---------------------------------------------------
  2 - access("T"."CODE_ITEM_NO"='031' AND "T"."CODE"='1B')
 
  14 rows selected
 
  优点:适合于bind var的SQL。可以直接执行,能够根据相关信息排序,显示界面友好。
 
  5.使用autotrace查看 ,可以查看一些统计信息(只显示执行计划统计,不显示执行结果
  首先执行脚本
  SQL>@D:oracleora92rdbmsadminutlxplan.sql 建立plan_table表
  SQL> set autotrace on
  SQL> set autotrace traceonly

  SQL> set timing on
  SQL> select * from cmdba.cmcdms;
 
  已选择3327行。
 
  已用时间:  00: 00: 00.13
 
  Execution Plan
  ----------------------------------------------------------
  0      SELECT STATEMENT Optimizer=CHOOSE (Cost=9 Card=3327 Bytes=23
  6217)
 
  1    0   TABLE ACCESS (FULL) OF 'CMCDMS' (TABLE) (Cost=9 Card=3327
  Bytes=236217)
 
  Statistics
  ----------------------------------------------------------
  0  recursive calls
  0  db block gets
  256  consistent gets
  0  physical reads
  0  redo size
  351787  bytes sent via SQL*Net to client
  24956  bytes received via SQL*Net from client
  446  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  3327  rows processed
 
  或者:
 
  SQL> set autotrace trace explain
  SQL> select * from v$parameter;
  Execution Plan
  ----------------------------------------------------------
  Plan hash value: 1128103955
  ------------------------------------------------------------------------------
  | Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  ------------------------------------------------------------------------------
  |   0 | SELECT STATEMENT  |          |     1 |   926 |     1 (100)| 00:00:01 |
  |*  1 |  HASH JOIN        |          |     1 |   926 |     1 (100)| 00:00:01 |
  |*  2 |   FIXED TABLE FULL| X$KSPPI  |     1 |   249 |     0   (0)| 00:00:01 |
  |   3 |   FIXED TABLE FULL| X$KSPPCV |   100 | 67700 |     0   (0)| 00:00:01 |
  ------------------------------------------------------------------------------
  Predicate Information (identified by operation id):
  ---------------------------------------------------
  1 - access("X"."INDX"="Y"."INDX")
      filter(TRANSLATE("KSPPINM",'_','#') NOT LIKE '#%' OR
      "KSPPSTDF"='FALSE' OR BITAND("KSPPSTVF",5)>0)
  2 - filter("X"."INST_ID"=USERENV('INSTANCE') AND
      TRANSLATE("KSPPINM",'_','#') NOT LIKE '##%')
 
  关于Autotrace几个常用选项的说明:
  SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式
  SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只显示优化器执行路径报告
  SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息
  SET AUTOTRACE ON ----------------- 包含执行计划和统计信息
  SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不显示查询输出
  这种方法显示内容较多……
 
  6.使用sql_trace查看 ,这个跟3差不多
  在pl/sql或者sqlplus中,打开一个sql_window。
  (1)先运行:alter session set sql_trace=true;
  (2)再运行你那个返回结果不正确的SQL
  (3)再运行:alter session set sql_trace=false;
  (4)马上登陆到机器上,到$ORACLE_BASE/admin/sid/udump目录下。
  (5)找到刚生成的.trc文件(假设文件名是 xxx.trc),
  执行命令转储跟踪文件:tkprof xxx.trc aa.txt。
  查看aa.txt文件。这个文件里面有执行计划。看看执行计划每一步返回的结果集记录数是不是正确。
  (TTT:在udump目录下未找到新生成的*.trc,但在$ORACLE_BASE/admin/sid/bdump下找到相关文件,转储成功。oracle8i在$ORACLE_BASE\rdbms\trace\目录下。)
 
  7.通过10053事件来查看,这里面可以查到一些关于SQL成本的详细信息 (TTT:未测试成功,第一条语句不明)
  在pl/sql或者sqlplus中,打开一个sql_window。
  (1)先运行:Alter session set events’10053 trace name context forever[,level {1/2}]’;
  (2)再运行你那个返回结果不正确的SQL
  (3)再运行:Alter session set events’10053 trace name context off’;
  (4)马上登陆到10.1.4.10机器上,到$ORACLE_BASE/admin/sid/udump目录下。找到刚生成的.trc文件)。
 

  8. 通过AWRRPT查看 (TTT:未测试)
   同其他方式一样,要想获得sql语句的执行计划,必须获得该sql的sql_id。有了sql_id,并且确认该sql已经被记录在 dba_hist_sqltext里,你就可以使用oracle10g提供的dbms_xplan.display_awr包显示指定sql_id的执行 计划。
  比如,执行一条sql,通过awrrpt获取其执行计划的步骤如下:
  1)执行sql语句
  sql>select /*awrshow*/ id from test order by id;
  2)确认sql语句的sql_id
  sql>select sql_id,sql_text from v$sql where sql_text like '%awrshow%';
  3)确认该sql是否被记录在dba_hist_sqltext里
  sql>select sql_id,sql_text from dba_hist_sqltext where sql_id = '****';
  注意:如果没有该sql的信息,则手工设置AWR的snapshot,将sql信息记录在dba_hist_sqltext里。执行如下sql命令: 
  sql>exec dbms_workload_repository.create_snapshot();
  4)使用dbms_xplan.display_awr的包显示指定sql_id的执行计划
  sql>select plan_table_output from table(dbms_xplan.display_awr('sql_id'));
  结合AWRRPT功能查看sql语句的执行计划最大的用处就是,当业务出现瓶颈或是峰值时,你可以获得异常时间段内问题sql语句的执行计划与正常表现时的进行对比。当然前提是,数据库是Oracle10g及以上版本,并使用了AWRRPT功能。

 

最近研究SQL调优,mark一下,感谢:http://huchen0907.iteye.com/blog/1249484

分享到:
评论

相关推荐

    hive执行计划可视化工具

    - **Hive自带的Explain命令**:虽然它不是图形化的,但可以通过输出文本信息来查看执行计划的概要。 - **Hue**:一个流行的Hadoop用户界面,包括一个内置的Hive编辑器,它可以显示执行计划的可视化表示。 - **Tez...

    剖析SQL Server执行计划

    - **文本格式执行计划**:显示执行计划的基本信息,适合快速查看查询的主要操作。 #### 四、案例分析 本书还包含了丰富的案例研究和代码示例,帮助读者深入理解SQL Server执行计划的工作原理及其对查询性能的影响...

    通过分析SQL语句的执行计划优化SQL(总结)

    3. **查看执行计划**: 在不同的数据库系统中,如MySQL、Oracle、SQL Server等,都有相应的命令或工具用于查看SQL语句的执行计划,例如SQL Server的`SET SHOWPLAN_ALL`或`SET SHOWPLAN_TEXT`,Oracle的`EXPLAIN ...

    通过分析SQL语句的执行计划优化SQL

    在Oracle中,可以使用`EXPLAIN PLAN`或`DBMS_XPLAN`包来查看执行计划。例如,使用`EXPLAIN PLAN FOR`先解释SQL,然后用`SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);`显示计划。 三、执行计划的关键元素 1. **操作符...

    MYSQL执行计划及索引最佳实践

    ### MySQL执行计划及索引最佳实践 #### 一、MySQL执行计划详解 MySQL执行计划是MySQL处理SQL查询的方式,它提供了关于SQL语句如何被优化和执行的信息。通过理解执行计划,可以有效地优化SQL查询,提高数据库性能。...

    Oracle执行计划.pptx

    - **Explain Plan**:通过EXPLAIN PLAN语句,我们可以将执行计划存入PLAN_TABLE,然后查看表中的内容来分析计划。 - **Autotrace**:在SQL*Plus中,设置AUTOTRACE ON可以自动执行SQL并显示执行计划和统计信息,...

    通过分析SQL语句的执行计划优化SQL总结)

    8. **使用EXPLAIN PLAN或类似的工具**:大多数数据库系统提供工具查看执行计划,如MySQL的EXPLAIN,Oracle的EXPLAIN PLAN,或SQL Server的SET SHOWPLAN_ALL。这些工具帮助我们理解执行过程并定位问题。 9. **参数化...

    94 MySQL是如何根据成本优化选择执行计划的?(上).pdf

    MySQL数据库查询优化是一个涉及成本评估的重要过程。在数据库执行查询时,可以存在...通过使用“EXPLAIN”语句,我们可以查看MySQL为特定SQL语句生成的执行计划,进而深入分析其选择的成本最低的执行计划的具体依据。

    MSSQL优化之探索MSSQL执行计划(转)

    本文将深入探讨如何查看和理解MSSQL执行计划,以及它如何影响SQL查询的效率。 首先,创建一个测试表`T_UserInfo`,并插入一定数量的数据。在SQL Server中,索引是提高查询性能的关键。这里创建了两个索引:一个聚集...

    99 MySQL是如何基于各种规则去优化执行计划的?(下).pdf

    - 执行计划的可视化:如何使用EXPLAIN等工具查看执行计划。 - SQL调优策略:如何根据执行计划发现性能瓶颈并进行优化。 - MySQL架构:理解InnoDB、MyISAM等存储引擎对优化器的影响。 在互联网公司的工作环境中,...

    Oracle 批处理

    Oracle批处理是数据库管理中的一个重要概念,主要用于执行大量的SQL语句或者存储过程,通常在非交互式模式下,比如在夜间或系统低峰时运行,以提高效率和资源利用率。这种方式能够有效地处理大数据量的更新、插入和...

    使用SQL Server作业执行SSIS包

    接下来,转到“计划”选项卡,新建一个作业计划。在这里,你可以设置执行的频率,比如每天、每周或每月,以及具体的时间。例如,你可以设置每天早上6:00执行,或者每周一至周五的特定时间。这样的计划设置允许 SSIS ...

    Oracle全表扫描及其执行计划

    4. 使用`FULL`提示:在SQL语句中明确指定`FULL`提示,会强制执行全表扫描。 5. 统计信息不准确:Oracle基于统计信息决定是否使用全表扫描,如果统计信息过时或缺失,可能会误判为全表扫描更优。 6. 数据块小于DB_...

    oracle数据库执行查询语句

    执行计划可以通过`EXPLAIN PLAN`或`DBMS_XPLAN`包来查看。 3. **表和索引的访问策略**:Oracle根据表和索引的统计信息选择最佳访问方式。全表扫描适用于数据分布均匀的大表,而索引扫描则适用于快速定位特定记录。...

    行业-105 透彻研究通过explain命令得到的SQL执行计划(6).rar

    而`EXPLAIN`命令是SQL中的一个重要特性,它允许我们分析和理解SQL查询的执行计划,从而帮助我们优化查询性能。本篇文章将深入探讨通过`EXPLAIN`命令获取的SQL执行计划,特别是针对第六部分的重点内容。 在MySQL、...

    kettle的简单数据转换demo

    你可以创建一个工作流,包含启动此数据转换的任务,并设置定时器使其按计划执行。 7. **高级特性**:Kettle提供了丰富的数据处理功能,如数据类型转换、数据清洗、聚合、JOIN操作等。它还支持通过插件扩展,以满足...

    Oracle sql优化.pdf

    2. 执行计划的查看:了解如何查看执行计划,包括使用 DBMS_XPLAN 等工具。 3. 执行计划的优化:了解如何优化执行计划,包括调整优化器参数等。 六、优化器参数调整 优化器参数调整是 Oracle SQL 优化中非常重要的...

    在SQLServer上查看SQL语句的执行时间的方法

    这包括`STATISTICS PROFILE`(显示执行计划的逻辑读写、CPU时间和分配信息)、`STATISTICS IO`(显示物理读写的统计信息)和`STATISTICS TIME`(显示SQL语句的CPU时间和总计时间)。开启这些选项后执行你的SQL语句,...

    SQL语句的执行步骤和优化

    - 过程:将复杂的SQL表达式简化为等效的简单连接表达式,以便于后续的执行计划生成。 - 结果:生成更易于优化的表达式形式。 5. **选择优化器**: - 目的:决定使用哪一种优化策略来生成执行计划。 - 过程:...

Global site tag (gtag.js) - Google Analytics