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的采集周期内的生成报表。
*/
分结论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的采集周期内的生成报表。
*/
相关文章推荐
- 查看Oracle执行计划的几种方法 / oracle中DateTime类型的字段,建立索引后,查寻时索引如何生效?/ oracle 中sql语句怎么加多个强制索引
- Oracle删除一条SQL在Shared Pool里缓存的执行计划的三种方法
- 分析oracle的sql语句的执行计划
- Oracle固定SQL的执行计划(二)---SPM
- ORACLE PL/SQL Developer工具执行计划无COST和cardinality,bytes等列值显示问题
- Oracle技术之如何使用ordered提示改变SQL执行计划
- sql执行计划[Oracle] 变量绑定
- oracle获取sql执行计划方法
- oracle读懂执行计划之得到sql的执行计划
- oracle优化4(sql语句性能诊断,sql执行计划)
- Oracle之SQL优化专题01-查看SQL执行计划的方法
- 000015.OracleSQL执行计划
- 使用oracle sql profile固定执行计划
- Oracle的HINT可以强制指定SQL的执行计划,比如选择索引、表的连接顺序以及表的连接方式等等。(转)
- Oracle执行计划之SQL优化
- Oracle SQL baseline--调整执行计划的三种方法(转载)
- 多种方法查看Oracle SQL执行计划
- oracle——查看sql的执行计划
- Oracle查看SQL执行计划的方式