您的位置:首页 > 数据库 > Oracle

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

2017-10-26 14:20 323 查看
解析:同一个表名对应不同的用户,对用不同的表结构,就会产生一条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

------------------------------------------
4000
----------------------------------------------------

| 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的采集周期内的生成报表。

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: