天天看點

Oracle 執行計劃

檢視執行計劃的方法:

1.Explain Plan For SQL

不實際執行SQL詫句,生成的計劃未必是真實執行的計劃

必須要有plan_table

2.SQLPLUS AUTOTRACE

除set autotrace traceonly explain外均實際執行SQL,但仍未必是真實計劃必須要有plan_table

3.SQL TRACE

需要啟用10046戒者SQL_TRACE

一般用tkprof看的更清楚些,當然10046裡本身也有執行計劃資訊

4.V$SQL和V$SQL_PLAN

可以查詢到多個子遊标的計劃資訊了,但是看起來比較費勁

5.Enterprise Manager

可以圖形化顯示執行計劃,但并非所有環境有EM可用

6.其他第三方工具

注意 PL/SQL developer之類工具F5看到的執行計劃未必是真實的

檢視詳細執行計劃:

alter session set STATISTICS_LEVEL = ALL; --不設定無法獲得A-ROWS等資訊

如果輸入NULL 則預設為之前運作的一條SQL,但注意要保持set serveroutput off,否則最後一句SQL将丌是你運作的SQL:

alter session set STATISTICS_LEVEL = ALL;

set serveroutput off;

select * From DATA_SKEW_HB where source='Maclean Search';

SQL> select * from TABLE(dbms_xplan.display_cursor('fk641nh8gjzvk',NULL,'ADVANCED +PEEKED_BINDS'));

SQL> select * from table(dbms_xplan.DISPLAY_CURSOR(null, null, 'ALLSTATS'));

格式:

ALLSTATS IOSTATS + MEMSTATS

IOSTATS 顯示該遊标累計執行的IO統計資訊(Buffers, Reads)

MEMSTATS 累計執行的PGA使用資訊(Omem 1Mem Used-Mem)

LAST 僅顯示最後一次執行的統計資訊

Advanced 顯示outline、Query Block Name、 Column Projection等資訊

PEEKED_BINDS 列印解析時使用的綁定變量

Typical 丌列印PROJECTION, ALIAS 組合使用的方式如下,注意每個關鍵詞後面要加空格

例如 ‘typical +peeked_binds’ => work ‘typical+peeked_binds’ => Error: format 'TYPICAL+peeked_binds' not valid for DBMS_XPLAN

推薦格式:

ALTER SESSION SET STATISTICS_LEVEL=ALL;

select * from table(dbms_xplan.display_cursor(null,null,'ADVANCED ALLSTATS LAST PEEKED_BINDS'));

父子遊标

使用腳本查詢SQL_ID

select sql_id,sql_text from v$SQL Where

sql_text not like '%like%'

and sql_text like '%$SQL%'; --$SQL處填入你的SQL的文本

為了避免你的SQL和其他SQL混在一起,考慮增加一個注釋 例如

Select /* MACLEAN_TEST_PLAN_1 */ * from MAC;

如果你之前執行過該詫句,那麼為了引發該詫句的再次硬解析,對注釋略作修改,例如上面的 PLAN_1 改為PLAN_2

父遊标所在

Select * from v$SQLAREA where SQL_ID=%YOUR_SQL_ID%;

子遊标:執行計劃和優化環境

Select * from v$SQL where SQL_id=%YOUR_SQL_ID%;

計劃:

Select * from v$SQL_PLAN where SQL_id=%YOUR_SQL_ID%;

優化環境:

Select * from v$SQL_OPTIMIZER_ENV where SQL_id=%YOUR_SQL_ID%;