查詢oracle sql的執行計畫時,一個很重要的視圖--dba_hist_sql_plan,dbahistsqlstat
本文的編寫得到枯榮長老的大力協助,在此表示感謝。
本文適用的oracle db版本為oracle 10g或者更高版本.
之所以說這個視圖很重要,是因為該視圖中有一列是在awrsqrpt報告中沒有的。這一列就是 filter_predicates列。
SELECT plan_hash_value,
TO_CHAR(RAWTOHEX(child_address)), TO_NUMBER(child_number), id, LPAD(' ', DEPTH) || operation operation, options, object_owner, object_name, optimizer, cost, access_predicates, filter_predicates FROM V$SQL_PLAN WHERE sql_id = 'bkcyk7bf380t6' ORDER BY 1, 3, 2, 4; 重點關注optimizer列,filter_predicates列。 若是該sql不在shared pool中時,改為執行如下的sql: set linesize 500set pagesize 500col plan_hash_value format 9999999999col id format 999999col operation format a30col options format a15col object_owner format a15col object_name format a20col optimizer format a15col cost format 9999999999col access_predicates format a15col filter_predicates format a15
SELECT plan_hash_value, id, LPAD (' ', DEPTH) || operation operation, options, object_owner, object_name, optimizer, cost, access_predicates, filter_predicates FROM dba_hist_sql_plan WHERE sql_id = 'fahv8x6ngrb50'ORDER BY plan_hash_value, id; 重點關注filter_predicates列。--這一列能協助判斷不走索引的原因。這一列的查詢結果若是為null,那就是正常的。若是不為null,那就需要額外關注不為空白的原因,如所示:
oracle sql的執行計畫怎查看
一、通過PL/SQL Dev工具
1、直接File->New->Explain Plan Window,在視窗中執行sql可以查看計劃結果。其中,Cost表示cpu的消耗,單位為n%,Cardinality表示執行的行數,等價Rows。
2、先執行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)便可以看到oracle的執行計畫了,看到的結果和1中的一樣,所以使用工具的時候推薦使用1方法。
注意:PL/SQL Dev工具的Command window中不支援set autotrance on的命令。還有使用工具方法查看計劃看到的資訊不全,有些時候我們需要sqlplus的支援。
二、通過sqlplus
1.最簡單的辦法
Sql> set autotrace on
Sql> select * from dual;
執行完語句後,會顯示explain plan 與 統計資訊。
這個語句的優點就是它的缺點,這樣在用該方法查看執行時間較長的sql語句時,需要等待該語句執行成功後,才返回執行計畫,使最佳化的周期大大增長。如果不想執行語句而只是想得到執行計畫可以採用:
Sql> set autotrace traceonly
這樣,就只會列出執行計畫,而不會真正的執行語句,大大減少了最佳化時間。雖然也列出了統計資訊,但是因為沒有執行語句,所以該統計資訊沒有用處,如果執行該語句時遇到錯誤,解決方案為:
(1)在要分析的使用者下:
Sqlplus > @ ?
dbmsadminutlxplan.sql
(2) 用sys使用者登陸
Sqlplus > @ ?sqlplusadminplustrce.sql
Sqlplus > grant plustrace to user_name;
- - user_name是上面所說的分析使用者
2.用explain plan命令
(1) sqlplus > explain plan for select * from testdb.myuser
(2) sqlplus > select * from table(dbms_xplan.display);
上面這2種方法只能為在本會話中正在啟動並執行語句產生執行計畫,即我們需要已經知道了哪條語句啟動並執行效率很差,我們是有目的只對這條SQL語句去最佳化。其實,在很多情況下,我們只會聽一個客戶抱怨說現在系統運行很慢,而我們不知道是哪個SQL引起的。此時有許多現成的語句可以找出耗費資源比較多的語句,如:
SELECT ADDRESS, substr(SQL_TEXT,1,20) Text, buffer_gets, executions,
buffer_gets/executions AVG FROM v$sqlarea
WHERE executions>0 AND buffer_gets > 100000 ORDER BY 5;
ADDRESS TEXT BUFFER_GETS EXECUTIONS AVG
-------- ---------------------------------------- ----------- ---------- -......餘下全文>>
oracle 中 一個sql的執行有沒有用到索引,執行順序是怎的?怎才可以看到這一點?
寫好sql 在plsql中點下F5 就能看到解釋計划了