Oracle執行計劃的6種方法
阿新 • • 發佈:2018-12-17
/*
總的結論:
一.獲取執行計劃的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
二.適用場合分析
1.如果某SQL執行非常長時間才會出結果,甚至慢到返回不了結果,這時候看執行計劃就只能用方法1; 2.跟蹤某條SQL最簡單的方法是方法1,其次就是方法2; 3.如果想觀察到某條SQL有多條執行計劃的情況,只能用方法4和方法6; 4.如果SQL中含有多函式,函式中套有SQL等多層遞迴呼叫,想準確分析,只能使用方法5; 5.要想確保看到真實的執行計劃,不能用方法1和方法2; 6.要想獲取表被訪問的次數,只能使用方法3;
*/
----方法1(explain plan for 的方式。類似PLSQL DEVELOPE裡的F5)
/* 步驟1:explain plan for "你的SQL" 步驟2:select * from table(dbms_xplan.display()); */ /* 優點: 1.無需真正執行,快捷方便
缺陷: 1.沒有輸出執行時的相關統計資訊(產生多少邏輯讀,多少次遞迴呼叫,多少次物理讀的情況); 2.無法判斷是處理了多少行; 3.無法判斷表被訪問了多少次。
確實啊,這畢竟都沒有真正執行又如何得知真實執行產生的統計資訊。 */
----方法2(set autotrace on 方式) /* 步驟1:set autotrace on 步驟2:在此處執行你的SQL即可,後續自然會有結果輸出
另,有如下幾種方式: set autotrace on (得到執行計劃,輸出執行結果) set autotrace traceonly (得到執行計劃,不輸出執行結果) set autotrace traceonly explain (得到執行計劃,不輸出執行結果和統計資訊部分,僅展現執行計劃部分) set autotrace traceonl statistics(不輸出執行結果和執行計劃部分,僅展現統計資訊部分) */
/* --優點:1.可以輸出執行時的相關統計資訊(產生多少邏輯讀,多少次遞迴呼叫,多少次物理讀的情況); 2.雖然必須要等語句執行完畢後才可以輸出執行計劃,但是可以有traceonly開關來控制返回結果不打屏輸出。
--缺陷:1.必須要等到語句真正執行完畢後,才可以出結果; 2.無法看到表被訪問了多少次。
*/
----方法3(statistics level=all的方式) /* 步驟1:alter session set statistics_level=all ; 步驟2:在此處執行你的SQL 步驟3:select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
另注:
1. 如果你用 /*+ gather_plan_statistics */的方法,可以省略步驟1,直接步驟2,3。 2. 關鍵字解讀(其中OMem、1Mem和User-Mem在後續的課程中會陸續見到): Starts為該sql執行的次數。 E-Rows為執行計劃預計的行數。 A-Rows為實際返回的行數。A-Rows跟E-Rows做比較,就可以確定哪一步執行計劃出了問題。 A-Time為每一步實際執行的時間(HH:MM:SS.FF),根據這一行可以知道該sql耗時在了哪個地方。 Buffers為每一步實際執行的邏輯讀或一致性讀。 Reads為物理讀。 OMem:當前操作完成所有記憶體工作區(Work Aera)操作所總共使用私有記憶體(PGA)中工作區的大小, 這個資料是由優化器統計資料以及前一次執行的效能資料估算得出的 1Mem:當工作區大小無法滿足操作所需的大小時,需要將部分資料寫入臨時磁碟空間中(如果僅需要寫入一次就可以完成操作, 就稱一次通過,One-Pass;否則為多次通過,Multi_Pass).該列資料為語句最後一次執行中,單次寫磁碟所需要的記憶體 大小,這個由優化器統計資料以及前一次執行的效能資料估算得出的 User-Mem:語句最後一次執行中,當前操作所使用的記憶體工作區大小,括號裡面為(發生磁碟交換的次數,1次即為One-Pass, 大於1次則為Multi_Pass,如果沒有使用磁碟,則顯示OPTIMAL) OMem、1Mem為執行所需的記憶體評估值,0Mem為最優執行模式所需記憶體的評估值,1Mem為one-pass模式所需記憶體的評估值。 0/1/M 為最優/one-pass/multipass執行的次數。Used-Mem耗的記憶體
*/
----方法4(知道sql_id後,直接帶入的方式,簡單,就步驟1)
/*
步驟1: select * from table(dbms_xplan.display_cursor('&sq_id')); (該方法是從共享池裡得到)
注: 1. 還有一個方法,select * from table(dbms_xplan.display_awr('&sq_id'));(這是awr效能視圖裡獲取到的) 2. 如果有多執行計劃,可以用類似方法查出 select * from table(dbms_xplan.display_cursor('cyzznbykb509s',0)); select * from table(dbms_xplan.display_cursor('cyzznbykb509s',1));
*/
看懂執行計劃: 檢視視訊教程地址: http://www.tudou.com/programs/view/9HohzhJQZaI
前半部分如何查詢執行計劃
到 42分50秒:左右開始將執行計劃的樹形結構。隱藏列,每列的名字,含義。 85分24秒 講例項
一.獲取執行計劃的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
二.適用場合分析
1.如果某SQL執行非常長時間才會出結果,甚至慢到返回不了結果,這時候看執行計劃就只能用方法1; 2.跟蹤某條SQL最簡單的方法是方法1,其次就是方法2; 3.如果想觀察到某條SQL有多條執行計劃的情況,只能用方法4和方法6; 4.如果SQL中含有多函式,函式中套有SQL等多層遞迴呼叫,想準確分析,只能使用方法5; 5.要想確保看到真實的執行計劃,不能用方法1和方法2; 6.要想獲取表被訪問的次數,只能使用方法3;
*/
----方法1(explain plan for 的方式。類似PLSQL DEVELOPE裡的F5)
/* 步驟1:explain plan for "你的SQL" 步驟2:select * from table(dbms_xplan.display()); */ /* 優點: 1.無需真正執行,快捷方便
缺陷: 1.沒有輸出執行時的相關統計資訊(產生多少邏輯讀,多少次遞迴呼叫,多少次物理讀的情況); 2.無法判斷是處理了多少行; 3.無法判斷表被訪問了多少次。
確實啊,這畢竟都沒有真正執行又如何得知真實執行產生的統計資訊。 */
----方法2(set autotrace on 方式) /* 步驟1:set autotrace on 步驟2:在此處執行你的SQL即可,後續自然會有結果輸出
另,有如下幾種方式: set autotrace on (得到執行計劃,輸出執行結果) set autotrace traceonly (得到執行計劃,不輸出執行結果) set autotrace traceonly explain (得到執行計劃,不輸出執行結果和統計資訊部分,僅展現執行計劃部分) set autotrace traceonl statistics(不輸出執行結果和執行計劃部分,僅展現統計資訊部分) */
/* --優點:1.可以輸出執行時的相關統計資訊(產生多少邏輯讀,多少次遞迴呼叫,多少次物理讀的情況); 2.雖然必須要等語句執行完畢後才可以輸出執行計劃,但是可以有traceonly開關來控制返回結果不打屏輸出。
--缺陷:1.必須要等到語句真正執行完畢後,才可以出結果; 2.無法看到表被訪問了多少次。
*/
----方法3(statistics level=all的方式) /* 步驟1:alter session set statistics_level=all ; 步驟2:在此處執行你的SQL 步驟3:select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
另注:
1. 如果你用 /*+ gather_plan_statistics */的方法,可以省略步驟1,直接步驟2,3。 2. 關鍵字解讀(其中OMem、1Mem和User-Mem在後續的課程中會陸續見到): Starts為該sql執行的次數。 E-Rows為執行計劃預計的行數。 A-Rows為實際返回的行數。A-Rows跟E-Rows做比較,就可以確定哪一步執行計劃出了問題。 A-Time為每一步實際執行的時間(HH:MM:SS.FF),根據這一行可以知道該sql耗時在了哪個地方。 Buffers為每一步實際執行的邏輯讀或一致性讀。 Reads為物理讀。 OMem:當前操作完成所有記憶體工作區(Work Aera)操作所總共使用私有記憶體(PGA)中工作區的大小, 這個資料是由優化器統計資料以及前一次執行的效能資料估算得出的 1Mem:當工作區大小無法滿足操作所需的大小時,需要將部分資料寫入臨時磁碟空間中(如果僅需要寫入一次就可以完成操作, 就稱一次通過,One-Pass;否則為多次通過,Multi_Pass).該列資料為語句最後一次執行中,單次寫磁碟所需要的記憶體 大小,這個由優化器統計資料以及前一次執行的效能資料估算得出的 User-Mem:語句最後一次執行中,當前操作所使用的記憶體工作區大小,括號裡面為(發生磁碟交換的次數,1次即為One-Pass, 大於1次則為Multi_Pass,如果沒有使用磁碟,則顯示OPTIMAL) OMem、1Mem為執行所需的記憶體評估值,0Mem為最優執行模式所需記憶體的評估值,1Mem為one-pass模式所需記憶體的評估值。 0/1/M 為最優/one-pass/multipass執行的次數。Used-Mem耗的記憶體
*/
----方法4(知道sql_id後,直接帶入的方式,簡單,就步驟1)
/*
步驟1: select * from table(dbms_xplan.display_cursor('&sq_id')); (該方法是從共享池裡得到)
注: 1. 還有一個方法,select * from table(dbms_xplan.display_awr('&sq_id'));(這是awr效能視圖裡獲取到的) 2. 如果有多執行計劃,可以用類似方法查出 select * from table(dbms_xplan.display_cursor('cyzznbykb509s',0)); select * from table(dbms_xplan.display_cursor('cyzznbykb509s',1));
*/
看懂執行計劃: 檢視視訊教程地址:
到 42分50秒:左右開始將執行計劃的樹形結構。隱藏列,每列的名字,含義。 85分24秒 講例項