Oracle之一條SQL對應多個執行計劃
阿新 • • 發佈:2019-01-23
解析:同一個表名對應不同的使用者,對用不同的表結構,就會產生一條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的採集週期內的生成報表。
*/
分結論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的採集週期內的生成報表。
*/