Oracle查看SQL執(zhí)行計(jì)劃的幾種方法
Oracle查看SQL執(zhí)行計(jì)劃的方法
一.使用AUTOTRACE查看執(zhí)行計(jì)劃
我們利用SQLPLUS中自帶的AUTOTRACE工具查看執(zhí)行計(jì)劃。AUTOTRACE用法如下。
set autot on: 該命令會(huì)運(yùn)行SQL并且顯示運(yùn)行結(jié)果,執(zhí)行計(jì)劃和統(tǒng)計(jì)信息。 set autot trace: 該命令會(huì)運(yùn)行SQL,但不顯示運(yùn)行結(jié)果,會(huì)顯示執(zhí)行計(jì)劃和統(tǒng)計(jì)信息。 set autot trace exp: 運(yùn)行該命令查詢語(yǔ)句不執(zhí)行,DML語(yǔ)句會(huì)執(zhí)行,只顯示執(zhí)行計(jì)劃。 set autot trace stat: 該命令會(huì)運(yùn)行 SQL,只顯示統(tǒng)計(jì)信息。 set autot off: 關(guān)閉 AUTOTRACE。
-執(zhí)行計(jì)劃中的各個(gè)參數(shù)解釋 recursive calls 表示遞歸調(diào)用的次數(shù),一個(gè)SQL第一次執(zhí)行就會(huì)發(fā)生硬解析,在硬解析的時(shí)候,優(yōu)化器會(huì)隱含地調(diào)用一些內(nèi)部SQL,因此當(dāng)一個(gè)SQL第一次執(zhí)行,recursive calls會(huì)大于0,第二次執(zhí)行的時(shí)候不需要遞歸調(diào)用,recursive calls就會(huì)等于0,如果SQL語(yǔ)句中有自定義函數(shù),recursive calls永遠(yuǎn)不會(huì)等于0,自定義函數(shù)被調(diào)用了多少次,recursive calls就會(huì)顯示為多少次 db block gets 表示有多少塊發(fā)生變化,一般情況下只有DML語(yǔ)句才會(huì)導(dǎo)致塊發(fā)生變化,所以查詢語(yǔ)句中的db block gets一般為0 consistent gets 表示邏輯讀,單位是塊。在SQL優(yōu)化的時(shí)候我們應(yīng)該想方設(shè)法減少邏輯讀的個(gè)數(shù),通常情況下邏輯讀越小,性能越好。需要注意的是,邏輯讀并不是衡量SQL執(zhí)行快慢的唯一標(biāo)準(zhǔn),需要結(jié)合I/O physical reads 表示從磁盤讀取了多少個(gè)數(shù)據(jù)塊,也就是物理讀。如果表已經(jīng)被緩存在buffer cache中,沒有物理讀,那么會(huì)等于0 redo size 表示產(chǎn)生了多少字節(jié)的重做日志,一般也是只有DML語(yǔ)句會(huì)產(chǎn)生redo,查詢語(yǔ)句一般情況下不會(huì)產(chǎn)生redo bytes sent via SQL*Net to client 表示從數(shù)據(jù)庫(kù)服務(wù)器發(fā)送了多少字節(jié)到客戶端 bytes received via SQL*Net from client 表示從客戶端發(fā)送了多少字節(jié)到服務(wù)端 SQL*Net roundtrips to/from client 表示客戶端與數(shù)據(jù)庫(kù)服務(wù)端交互次數(shù),我們可以通過(guò)設(shè)置arraysize減少交互次數(shù) sorts (memory) 內(nèi)存排序的次數(shù) sorts (disk) 磁盤排序的次數(shù) rows processed 表示SQL一共返回多少行數(shù)據(jù)。我們?cè)谧鯯QL優(yōu)化的時(shí)候最關(guān)心這部分?jǐn)?shù)據(jù),因?yàn)榭梢愿鶕?jù)SQL返回的行數(shù)判斷整個(gè)SQL應(yīng)該是走HASH連接還是走嵌套循環(huán)。如果rows processed很大,一般走HASH連接,如果rows processed很小,一般走嵌套循環(huán)。
二.使用EXPLAIN PLAN FOR查看執(zhí)行計(jì)劃
用法如下
explain plan for SQL語(yǔ)句; select * from table(dbms_xplan.display); -查看高級(jí)(ADVANCED)執(zhí)行計(jì)劃: explain plan for SQL語(yǔ)句; select * from table(dbms_xplan.display(NULL, NULL,'advanced -projection'));
三.查看帶有A-TIME的執(zhí)行計(jì)劃
alter session set statistics_level = all; select count(*) from test; select * from table(dbms_xplan.display_cursor(NULL, NULL,'allstats last')); 或者在SQL語(yǔ)句中添加hint:/*+ gather_plan_statistics */ select /*+ gather_plan_statistics */ count(*) from test where owner='SYS'; select * from table(dbms_xplan.display_cursor(NULL, NULL,'allstats last'));
Starts 表示這個(gè)操作執(zhí)行的次數(shù)。 E-Rows 表示優(yōu)化器估算的行數(shù),就是普通執(zhí)行計(jì)劃中的Rows。 A-Rows 表示真實(shí)的行數(shù)。 A-Time 表示累加的總時(shí)間。與普通執(zhí)行計(jì)劃不同的是,普通執(zhí)行計(jì)劃中的Time是假的,而A-Time是真實(shí)的。 Buffers 表示累加的邏輯讀。 Reads 表示累加的物理讀。
上面介紹了3種方法查看執(zhí)行計(jì)劃。
使用AUTOTRACE或者EXPLAIN PLAN FOR獲取的執(zhí)行計(jì)劃來(lái)自于PLAN_TABLE。
PLAN_TABLE是一個(gè)會(huì)話級(jí)的臨時(shí)表,里面的執(zhí)行計(jì)劃并不是SQL真實(shí)的執(zhí)行計(jì)劃,它只是優(yōu)化器估算出來(lái)的。
真實(shí)的執(zhí)行計(jì)劃不應(yīng)該是估算的,應(yīng)該是真正執(zhí)行過(guò)的。SQL執(zhí)行過(guò)的執(zhí)行計(jì)劃存在于共享池中,具體存在于數(shù)據(jù)字典V$SQL_PLAN中。
帶有A-Time的執(zhí)行計(jì)劃來(lái)自于V$SQL_PLAN,是真實(shí)的執(zhí)行計(jì)劃,而通過(guò)AUTOTRACE、通過(guò)EXPLAIN PLAN FOR獲取的執(zhí)行計(jì)劃只是優(yōu)化器估算獲得的執(zhí)行計(jì)劃。
四.查看正在執(zhí)行的SQL的執(zhí)行計(jì)劃
有時(shí)需要抓取正在運(yùn)行的SQL的執(zhí)行計(jì)劃,這時(shí)我們需要獲取SQL的SQL_ID以及SQ的CHILD_NUMEBR,然后將其代入下面SQL,就能獲取正在運(yùn)行的SQL的執(zhí)行計(jì)劃。
select * from table(dbms_xplan.display_cursor('sql_id',child_number)); -在一個(gè)會(huì)話中執(zhí)行如下SQL。 select count(*) from a,b where a.owner=b.owner; -在另外一個(gè)會(huì)話中執(zhí)行如下SQL 找出sql的sql_id和child_number select a.sid, a.event, a.sql_id, a.sql_child_number, b.sql_text from v$session a, v$sql b where a.sql_address = b.address and a.sql_hash_value = b.hash_value and a.sql_child_number = b.child_number order by 1 desc; -接下來(lái)我們將 SQL_ID 和 CHILD_NUMBER 代入以下SQL。 select * from table(dbms_xplan.display_cursor('czr9jwxv0xra6',0));
到此這篇關(guān)于Oracle查看SQL執(zhí)行計(jì)劃的幾種方法的文章就介紹到這了,更多相關(guān)Oracle查看SQL執(zhí)行計(jì)劃內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle數(shù)據(jù)庫(kù)的啟動(dòng)和關(guān)閉順序?qū)嵗v解
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)的啟動(dòng)和關(guān)閉順序?qū)嵗v解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07解決Windows 7下安裝Oracle 11g相關(guān)問(wèn)題的方法
本文將為大家介紹Windows 7下安裝Oracle 11g方面的有關(guān)問(wèn)題解決方案。希望通過(guò)本文,能讓大家對(duì)11g這款產(chǎn)品有更多的認(rèn)識(shí),需要的朋友可以參考下2015-08-08數(shù)據(jù)庫(kù)表分割技術(shù)淺析(水平分割/垂直分割/庫(kù)表散列)
數(shù)據(jù)庫(kù)表分割技術(shù)包含以下內(nèi)容:水平分割/垂直分割/庫(kù)表散列.接下來(lái)將對(duì)以上分割進(jìn)行詳細(xì)介紹,感興趣的朋友可以了解下,對(duì)你日后維護(hù)數(shù)據(jù)庫(kù)是很有幫助的2013-01-01Oracle配置dblink訪問(wèn)PostgreSQL的操作方法
本文給大家介紹下Oracle配置dblink訪問(wèn)PostgreSQL的操作方法,通過(guò)dblink訪問(wèn)PostgreSQL的詳細(xì)過(guò)程,對(duì)Oracle?dblink訪問(wèn)PostgreSQL相關(guān)知識(shí)感興趣的朋友一起看看吧2022-03-03Oracle通過(guò)正則表達(dá)式分割字符串 REGEXP_SUBSTR的代碼詳解
這篇文章主要介紹了Oracle通過(guò)正則表達(dá)式分割字符串 REGEXP_SUBSTR的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05