查看執行計劃
阿新 • • 發佈:2017-06-04
red tip 支持 輸出 數據訪問 根據 介紹 system one
1.工具介紹
總結:單純估算用autotrace,真實調優用DBMS_XPLAN帶參數
1、explain
因為綁定變量的原因,這個只能是估算
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
每個連上來的用戶都可以使用plan_table,不用特別的權限,也不用讀取諸如v$plan這樣的視圖。
不會實際執行SQL,也不會在shared pool上生成該SQL的cursor,是生成了一個cursor不過是帶上explain plan for字眼的,而沒有獨立的該sql的cursor產生。
2、autotrace
真實/估算,忽略綁定變量,非執行. 可以看邏輯讀等數量
SET AUTOTRACE
ON EXPLAIN 只顯示執行計劃 估算,因為沒執行
ON STATISTICS 只顯示執行的統計信息
AUTOTRACE ON 包含2,3兩項內容 真實,因為執行過
AUTOTRACE TRACEONLY 與ON相似,但不顯示語句的執行結果 真實,因為執行過
3.SQL_TRACE
在12c中文檔中提示:不再支持SQL_TRACE參數; 真實計劃,需要用TKPROF工具解析,可以獲得綁定變量值.
alter session set sql_trace=true;
alter session set sql_trace=false;
exec dbms_system.set_sql_trace_in_session(9,437,true)
exec dbms_system.set_sql_trace_in_session(9,437,false)
4.EVENT 10053 10046
真實計劃,研究執行計劃產生的原因
10046為增強版sql_trace
參考《10046事件》
參考《10046&10053的區別》
10053是檢查優化器行為的,實在搞不懂為什麽走那個計劃可以看看,用得較少。
10046可以檢查一些等待事件的內容,也可以獲取綁定變量,一般用得也比較少。
4.DBMS_XPLAN
真實計劃
4.1 dbms_xplan.display_cursor
2.執行計劃閱讀順序: 由上至下:在執行計劃中一般含有多個節點,相同級別(或並列)的節點,靠上的優先執行,靠下的後執行 從右向左:在某個節點下還存在多個子節點,先從最靠右的子節點開始執行。 靠光標大法即可,或者有些腳本裏面帶了執行的步驟 標量子查詢 可能違反最右最上原則,參考《Oracle SQL優化分析步驟》 執行計劃如果顯示是access,就表示這個謂詞條件的值將會影響數據的訪問路徑(表還是索引),而filter表示謂詞條件的值並不會影響數據訪問路徑,只起到過濾的作用 帶*號的是filter過濾 或 驅動access 動態采樣 如果在執行計劃中有如下提示: -dynamic sampling used for the statement 這提示用戶CBO當前使用的技術,需要用戶在分析計劃時考慮到這些因素。 當出現這個提示,說明當前表使用了動態采樣。 我們從而推斷這個表可能沒有做過分析 這裏會出現兩種情況: (1) 如果表沒有做過分析,那麽CBO可以通過動態采樣的方式來獲取分析數據,也可以或者正確的執行計劃。 (2) 如果表分析過,但是分析信息過舊,這時CBO就不會在使用動態采樣,而是使用這些舊的分析數據,從而可能導致錯誤的執行計劃。 在看執行計劃的時候,除了看執行計劃本身,還需要看謂詞和提示信息。 通過整體信息來判斷SQL 效率。 動態采樣適用範圍: 1.沒有統計信息,比如生成的中間臨時表 2.多列產生關聯,比如人為指定(11g還引入多列統計信息,但是是生成了一個列,代價大)
- DBMS_XPLAN.DISPLAY_CURSOR(
- sql_id IN VARCHAR2 DEFAULT NULL,
- child_number IN NUMBER DEFAULT NULL,
- format IN VARCHAR2 DEFAULT ‘TYPICAL‘);
2.執行計劃閱讀順序: 由上至下:在執行計劃中一般含有多個節點,相同級別(或並列)的節點,靠上的優先執行,靠下的後執行 從右向左:在某個節點下還存在多個子節點,先從最靠右的子節點開始執行。 靠光標大法即可,或者有些腳本裏面帶了執行的步驟 標量子查詢 可能違反最右最上原則,參考《Oracle SQL優化分析步驟》 執行計劃如果顯示是access,就表示這個謂詞條件的值將會影響數據的訪問路徑(表還是索引),而filter表示謂詞條件的值並不會影響數據訪問路徑,只起到過濾的作用 帶*號的是filter過濾 或 驅動access 動態采樣 如果在執行計劃中有如下提示: -dynamic sampling used for the statement 這提示用戶CBO當前使用的技術,需要用戶在分析計劃時考慮到這些因素。 當出現這個提示,說明當前表使用了動態采樣。 我們從而推斷這個表可能沒有做過分析 這裏會出現兩種情況: (1) 如果表沒有做過分析,那麽CBO可以通過動態采樣的方式來獲取分析數據,也可以或者正確的執行計劃。 (2) 如果表分析過,但是分析信息過舊,這時CBO就不會在使用動態采樣,而是使用這些舊的分析數據,從而可能導致錯誤的執行計劃。 在看執行計劃的時候,除了看執行計劃本身,還需要看謂詞和提示信息。 通過整體信息來判斷SQL 效率。 動態采樣適用範圍: 1.沒有統計信息,比如生成的中間臨時表 2.多列產生關聯,比如人為指定(11g還引入多列統計信息,但是是生成了一個列,代價大)
查看執行計劃