最全的display_cursor執行計畫查看使用方法,cursor

來源:互聯網
上載者:User

最全的display_cursor執行計畫查看使用方法,cursor
1.解釋並查看sql文本的執行計畫explain plan for select 3+5 from dual;select * from table(dbms_xplan.display());
select * from table(dbms_xplan.display(table_name=>'PLAN_TABLE',statement_id=>null,format=>'ALL'));用explain plan解釋一個SQL,相關資訊會預設被放到一個一個叫PLAN_TABLE的全域暫存資料表中。可以用這個來查看。參數:table_name,預設'PLAN_TABLE',如果別的一個表跟PLAN_TABLE有一樣的表結構,也可以讀取裡面的資訊。statement_id 預設null,即查該session最後的一條explain plan解釋的語句。format   預設'TYPICAL',全部是'BASIC','TYPICAL','ALL',ALL的時候會顯示PROJECTION, ALIAS and information about REMOTE SQL if the operation is distributed。其實除了指定這3個層級外,顯示什麼資訊也可以再通過後面的備忘(減號代表去除相關資訊)'ALL -PROJECTION -NOTE'  #ALL層級,但不要投射與NOTE資訊 'BASIC ROWS'  --BASE下本來沒有ROWS資訊,我們也可以給它加上。還有其他選項,如:outline
filter_perds   預設null  ,filter_preds=>'plan_id =32'  可以通過plan_table中的欄位,限制輸出什麼資訊,就如同where條件。每個連上來的使用者都可以使用plan_table,不用特別的許可權,也不用讀取諸如v$plan這樣的視圖。不會實際執行SQL,也不會在shared pool上產生該SQL的cursor,是產生了一個cursor不過是帶上explain plan for字眼的,而沒有獨立的該sql的cursor產生。

2.查看一個shared pool中的cursor的執行計畫select * from table(dbms_xplan.display_cursor());  --展示該session的最後一條SQL的執行計畫,只在sqlplus中合適。select * from table(dbms_xplan.display_cursor('fb8szhn9h5r95'));  select * from table(dbms_xplan.display_cursor('fb8szhn9h5r95',0,'TYPICAL'));  
#第一種展示session最後一條SQL的執行計畫,在plsql developer中不合適,這很可能是因為,plsql developer每執行完一個select後,就會預設開啟一個新的事務,會執行begin :id := sys.dbms_transaction.local_transaction_id; end;,所以這才是在plsql developer中的最後一條語句。#從shared pool中讀取cursor,並結合V$SQL_PLAN_STATISTICS_ALL,  V$SQL, and V$SQL_PLAN等視圖,將執行計畫展現。#如果缺乏許可權,可以SELECT privilege on V$SQL_PLAN_STATISTICS_ALL,V$SQL, and V$SQL_PLAN都授予。#格式,其中sql_id與child_no唯一標識某個cursor。sql_id  指定位於library cache執行計畫中SQL父遊標,如果不指定就返回session執行的最後一條SQL的sql_id。child_number  預設是0,如果是null,則返回sql_id所指父遊標下的所有子遊標的執行計畫。format  控制SQL語句執行計畫的輸出部分,即哪些可以顯示哪些不顯示。(預設TYPICAL),可以參考display(),也是basic,typical,all。
3.對於有詳細即時執行資訊的SQL除此之外當在開啟statistics_level=all時或使用gather_plan_statistics提示時,會用另外一個表,詳細地記錄運行時執行計畫與資訊。alter session set statistics_level=all; --也可以alter systemselect /*+ gather_plan_statistics */ /*fwy1806*/* from t1 where rownum<30;詳細地查看執行計畫
display_cursor比display()還多了一些東西,在詳細收集模式下,還可以加下面的選項。IOSTATS:會展示該SQL的累計IO統計資訊,加了last就顯示最後一個。MEMSTATS:只有開啟了PGA自動記憶體管理,即pga_aggregate_target不是0,我們才能使用這項,會展示使用了多少memory,多少bytes被交換到磁碟,一般來說用了hash-join,sort,group by等比較需要記憶體的操作才會收集。ALLSTATS:是'IOSTATS MEMSTATS'的同義字。LAST:預設地展示都是該遊標的累積統計資訊,加了LAST才會顯示最後一個。RUNSTATS_TOT  --為了向後相容,相當於IOSTATSRUNSTATS_LAST --為了向後相容,相當於IOSTATS LAST
查看該遊標最後一次的實際統計資訊執行計畫
select * from table(dbms_xplan.display_cursor('fb8szhn9h5r95',null,'allstats last'));會將該遊標的累積執行資訊列出,例如遊標執行過兩次後,starts,A-Rows,buffers也是上面的兩倍
select * from table(dbms_xplan.display_cursor('fb8szhn9h5r95',null,'allstats'));最詳細,彙集了普通模式的all與詳細模式的allstats,而且將預設不顯示的outline資訊也顯示出來。
select * from table(dbms_xplan.display_cursor('fb8szhn9h5r95',null,'all allstats last outline'));select * from table(dbms_xplan.display_cursor('fb8szhn9h5r95',2,'all allstats last outline'));  --加上child_no------------------------------------------------------------------------------------------------------------------------------| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers | Reads |------------------------------------------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | | | 3 (100)| | 25 |00:00:00.01 | 3 | 2 ||* 1 | COUNT STOPKEY | | 1 | | | | | 25 |00:00:00.01 | 3 | 2 || 2 | TABLE ACCESS FULL| T1 | 1 | 25 | 54400 | 3 (0)| 00:00:01 | 25 |00:00:00.01 | 3 | 2 |------------------------------------------------------------------------------------------------------------------------------
Starts為該sql執行的次數。E-Rows為執行計畫預計的行數。A-Rows為實際返回的行數。A-Rows跟E-Rows做比較,就可以確定哪一步執行計畫出了問題。A-Time為每一步實際執行的時間(HH:MM:SS.FF),根據這一行可以知道該sql耗時在了哪個地方。Buffers為每一步實際執行的邏輯讀或一致性讀。Reads為物理讀。OMem、1Mem為執行所需的記憶體評估值,0Mem為最優執行模式所需記憶體的評估值,1Mem為one-pass模式所需記憶體的評估值。0/1/M 為最優/one-pass/multipass執行的次數。

4. display_awr 展示awr資訊庫中的執行計畫SELECT * FROM table(DBMS_XPLAN.DISPLAY_AWR('09tr40mjc8vg5'));SELECT * FROM table(DBMS_XPLAN.DISPLAY_AWR('3hxb21q9h4t40',1367077082,null,'all'));
sql_id   --輸入儲存在AWR中的sql_id,你可以先查dba_hist_sql_plan,dba_hist_sqltext,看看某個語句屬於什麼sql_id。plan_hash_value  --如果是null的話該sql_id所有的執行計畫會輸出。預設nulldb_id  --如果忽略,預設就是當前的databaseformat  --參考display(),還是'basic','typical','all'這樣,預設typical
1.請確保AWR已經運行。 
2.許可權:使用者需要select on DBA_HIST_SQL_PLAN,DBA_HIST_SQLTEXT,V$DATABASE的許可權。3.查sql_id,根據sql文本查出sql_id ,可以從dba_hist_sqltext查。4.來源:展示的執行計畫的資訊,來源於dba_hist_sql_plan。5.詳細:是否可以用allstats這樣查看更詳細的執行計畫,這可能得取決於你當時的sql有沒開啟手機詳細運行時統計資訊。
5. display_sqlset   展示儲存在sql turning set中的sql的執行計畫。sqlset_name  specified the name of the SQL tuning set.sql_id    輸入儲存在sql tuning set中的sql_id,可以從DBA_SQLSET_PLANS看。plan_hash_value   如果是null,則該sql_id的所有執行計畫會被輸出。預設null。format    參考display(),也是'basic','typical','all',預設'typical'sqlset_owner      Specifies the owner of the SQL tuning set  預設目前使用者SELECT * FROM table(DBMS_XPLAN.DISPLAY_SQLSET('fwy_sqlset','3hxb21q9h4t40',1367077082,'all','fwy'));
6. display_sql_plan_baseline  展示儲存在SPM中的SQL執行計畫查看SPM中baseline的執行計畫:DBMS_XPLAN.DISPLAY_sql_plan_baselineSELECT *  FROM table(DBMS_XPLAN.DISPLAY_sql_plan_baseline('SQL_a074c4f7bacd50da','SQL_PLAN_a0x64yyxcun6u06957ae0','ALL')); 這樣看也行,就會看這個sql_handle下所有執行計畫SELECT * FROM table(DBMS_XPLAN.DISPLAY_sql_plan_baseline(sql_handle => 'SQL_351fadd1a0ec16be' ));SELECT *  FROM table(DBMS_XPLAN.DISPLAY_sql_plan_baseline(plan_name => 'SQL_PLAN_a0x64yyxcun6u06957ae0','ALL')); 
格式:sql_handle  SPM中的sql_handle相當於v$sql中的sql_id,預設Nullplan_name  SPM中唯一標識一個執行計畫,就像v$sql中的plan_hash_value。預設null。如果是null,那麼上面的sql_handle就必須指定。format:參考display(),預設typical。執行計畫來源於:DBA_SQL_PLAN_BASELINES




相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.