Oracle之一条SQL对应多个执行计划

解析:同一个表名对应不同的用户,对用不同的表结构,就会产生一条SQL产生多个执行计划。等


分结论4(一条SQL对应多个执行计划):


一. 关于获取执行计划的6种方法和各自区别大家在上一例子中已经大致明白了。
    1. explain plan for获取; 
    2. set autotrace on ;    
    3. statistics_level=all;
    4. 通过dbms_xplan.display_cursor输入sql_id参数直接获取
    5. 10046 trace跟踪
    6. awrsqrpt.sql
    
二. 执行计划中"一条SQL对应多个计划” 也是一个很重要的常识,这只能靠方法4和方法6了。
    隆重推出本次明星:方法4的dbms_xplan.display_cursor+sql_id和方法6的awrsqrpt.sql。
    




*/



---构建T表,数据,及主键


sqlplus ljb/ljb
DROP TABLE t;
CREATE TABLE t AS SELECT * FROM DBA_OBJECTS where object_id is not null;
create index idx_object_id on t(object_id);
alter table T modify object_id not null;
set autotrace off  
set linesize 1000
set pagesize 2000        
alter session set statistics_level=all ;
select count(*) from t;
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));


PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------
SQL_ID  cyzznbykb509s, child number 0
-------------------------------------
select count(*) from t


Plan hash value: 1131838604
----------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name          | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |               |      1 |        |      1 |00:00:00.10 |     170 |    162 |
|   1 |  SORT AGGREGATE       |               |      1 |      1 |      1 |00:00:00.10 |     170 |    162 |
|   2 |   INDEX FAST FULL SCAN| IDX_OBJECT_ID |      1 |  65318 |  73118 |00:00:00.09 |     170 |    162 |
----------------------------------------------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement (level=2)
已选择18行。








connect yxl/yxl
drop table t purge;
CREATE TABLE t AS SELECT rownum id ,rownum+1 n FROM DBA_OBJECTS ;
set autotrace off  
set linesize 1000  
set pagesize 2000               
alter session set statistics_level=all ;
select count(*) from t;
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------
SQL_ID  cyzznbykb509s, child number 1
-------------------------------------
select count(*) from t
Plan hash value: 2966233522
----------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |      1 |00:00:00.02 |     153 |     41 |
|   1 |  SORT AGGREGATE    |      |      1 |      1 |      1 |00:00:00.02 |     153 |     41 |
|   2 |   TABLE ACCESS FULL| T    |      1 |  62936 |  73120 |00:00:00.02 |     153 |     41 |
----------------------------------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement (level=2)




已选择18行。


















----(知道sql_id后,直接带入的方式)
select sql_id, child_number from v$sql  where sql_id='cyzznbykb509s';


SQL_ID        CHILD_NUMBER
------------- ------------
cyzznbykb509s            0
cyzznbykb509s            1




select * from table(dbms_xplan.display_cursor('cyzznbykb509s',0));


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  cyzznbykb509s, child number 0
-------------------------------------
select count(*) from t


Plan hash value: 1131838604
-------------------------------------------------------------------------------
| Id  | Operation             | Name          | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |               |       |    49 (100)|          |
|   1 |  SORT AGGREGATE       |               |     1 |            |          |
|   2 |   INDEX FAST FULL SCAN| IDX_OBJECT_ID | 65318 |    49   (0)| 00:00:01 |
-------------------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement (level=2)
已选择18行。






select * from table(dbms_xplan.display_cursor('cyzznbykb509s',1));


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------
SQL_ID  cyzznbykb509s, child number 1
-------------------------------------
select count(*) from t


Plan hash value: 2966233522
-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |    46 (100)|          |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T    | 62936 |    46   (3)| 00:00:01 |
-------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement (level=2)
已选择18行。




/*
特别说明一下,第6种获取执行计划的方法awrsqrpt.sql同样也可以获取到多条执行计划
这个方法当一条SQL有多个执行计划的时候,可以在报表里输出。但是要确保在AWR的采集周期内的生成报表。
*/
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值