如何获取执行计划

php中文网
发布: 2016-06-07 16:09:53
原创
1459人浏览过

如何oracle的获取执行计划1.获取普通执行计划,效果类似于先执行set autot on exp;然后执行sql。 explan plan for your_sql; select * from table(dbms_xplan.display);2.获取具有outline信息的执行计划,用sqlprofile调优时非常有用,或者用这个执行计划了

如何oracle的获取执行计划
1.获取普通执行计划,效果类似于先执行set autot on exp;然后执行sql。
  explan plan for your_sql;
  select * from table(dbms_xplan.display);
2.获取具有outline信息的执行计划,用sqlprofile调优时非常有用,或者用这个执行计划了解更多oracle内部的hint
  explan plan for your_sql;
  select * from table(dbms_xplan.display(null, null,'advanced -projection'))
3.真实的执行计划,可以看到实际的 Starts(执行次数) | E-Rows(估算的返回行数) | A-Rows(实际的返回行数)
  ALTER SESSION SET STATISTICS_LEVEL=ALL; 
  execute your_sql;
  SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,'ALLSTATS LAST'))
  
那么这3中获取执行计划的方式可以写到一个脚本getplan.sql,用的时候非常方便。
--getplan.sql
set feedback off timing off ver off
pro 'general,outline,starts'
pro
acc type prompt 'Enter value for plan type:' default 'general'
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,'ALLSTATS LAST')) where '&&type'='starts';
select * from table(dbms_xplan.display) where '&&type'='general';
select * from table(dbms_xplan.display(null, null,'advanced -projection')) where '&&type'='outline';
set feedback on timing on ver on
undef type


测试如下:
SQL> select * from a;

        ID NAME
---------- ----------
         1 a1
         2 a2
         3 a3
         4 a4
         5 a5
SQL> select * from b;

        ID NAME
---------- ----------
         1 b1
         2 b2
         
         
         
--执行计划1:普通执行计划
SQL> explain plan for select a.*,(select name from b where b.id=a.id) from a;

Explained.

Elapsed: 00:00:00.04
SQL> @getplan
'general,outline,starts'

Enter value for plan type:                ----这里输入general或回车

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------
Plan hash value: 3653839899

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     5 |   100 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| B    |     1 |    20 |     3   (0)| 00:00:01 |
|   2 |  TABLE ACCESS FULL| A    |     5 |   100 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("B"."ID"=:B1)

Note
-----
   - dynamic sampling used for this statement
   
   
   
--执行计划2:outline执行计划
SQL> explain plan for select a.*,(select name from b where b.id=a.id) from a;

Explained.

Elapsed: 00:00:00.01
SQL> @getplan
'general,outline,starts'

Enter value for plan type:outline           --这里输入outline

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------
Plan hash value: 3653839899

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     5 |   100 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| B    |     1 |    20 |     3   (0)| 00:00:01 |
|   2 |  TABLE ACCESS FULL| A    |     5 |   100 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$2 / B@SEL$2
   2 - SEL$1 / A@SEL$1

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      FULL(@"SEL$2" "B"@"SEL$2")
      FULL(@"SEL$1" "A"@"SEL$1")
      OUTLINE_LEAF(@"SEL$1")
      OUTLINE_LEAF(@"SEL$2")
      ALL_ROWS
      OPTIMIZER_FEATURES_ENABLE('10.2.0.4')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("B"."ID"=:B1)

Note
-----
   - dynamic sampling used for this statement   




--执行计划3:real执行计划
SQL> set serveroutput off
SQL> ALTER SESSION SET STATISTICS_LEVEL=ALL;

Session altered.

Elapsed: 00:00:00.00
SQL> select a.*,(select name from b where b.id=a.id) from a;

        ID NAME       (SELECTNAM
---------- ---------- ----------
         1 a1         b1
         2 a2         b2
         3 a3
         4 a4
         5 a5

5 rows selected.

Elapsed: 00:00:00.03
SQL> @getplan
'general,outline,starts'

Enter value for plan type:starts                  --这里输入starts

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------
SQL_ID  8rv825dykpx1m, child number 0
-------------------------------------
select a.*,(select name from b where b.id=a.id) from a

Plan hash value: 3653839899

------------------------------------------------------------------------------------
| Id  | Operation         | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------
|*  1 |  TABLE ACCESS FULL| B    |      5 |      1 |      2 |00:00:00.01 |      35 |
|   2 |  TABLE ACCESS FULL| A    |      1 |      5 |      5 |00:00:00.01 |       8 |
------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("B"."ID"=:B1)

Note
-----
   - dynamic sampling used for this statement

--注意:
--第3种执行计划不能多次获取,只能执行1次,获取一次,否则会获取不到
下面再次获取一下试试:
SQL> @getplan
'general,outline,starts'

Enter value for plan type:starts

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------
SQL_ID  dvp8nn63wuhs8, child number 0
-------------------------------------
select * from table(dbms_xplan.display(null, null,'advanced -projection'))
where 'starts'='outline'

Plan hash value: 3440229843

-------------------------------------------------------------------------------------
| Id  | Operation                          | Name    | Starts | A-Rows |   A-Time   |
-------------------------------------------------------------------------------------
|*  1 |  FILTER                            |         |      1 |      0 |00:00:00.01 |
|   2 |   COLLECTION ITERATOR PICKLER FETCH| DISPLAY |      0 |      0 |00:00:00.01 |   --第二次无法获取真实的执行计划
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(NULL IS NOT NULL)

Note
-----
   - rule based optimizer used (consider using cbo)
   
   
--第3种执行计划要关掉set serveroutput off,否则也不能获取执行计划。
测试如下:
这里和上面的测试是同一个会话,所以没有再执行ALTER SESSION SET STATISTICS_LEVEL=ALL;了。
SQL> set serveroutput on
SQL> select a.*,(select name from b where b.id=a.id) from a;

        ID NAME       (SELECTNAM
---------- ---------- ----------
         1 a1         b1
         2 a2         b2
         3 a3
         4 a4
         5 a5

5 rows selected.

Elapsed: 00:00:00.03
SQL> @getplan
'general,outline,starts'

Enter value for plan type:starts

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------
SQL_ID  9babjv8yq8ru3, child number 0

BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END;                    --也无法获取真实的执行计划

NOTE: cannot fetch plan for SQL_ID: 9babjv8yq8ru3, CHILD_NUMBER: 0
      Please verify value of SQL_ID and CHILD_NUMBER;
      It could also be that the plan is no longer in cursor cache (check v$sql_plan)   
登录后复制

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号