1. 程式人生 > >Oracle之一條SQL對應多個執行計劃

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的採集週期內的生成報表。
*/