亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Oracle查看SQL執(zhí)行計(jì)劃的幾種方法

 更新時(shí)間:2024年11月12日 10:09:58   作者:學(xué)無(wú)止境的小一  
在日常的運(yùn)維工作中,SQL優(yōu)化是DBA的進(jìn)階技能,SQL優(yōu)化的前提是要看SQL的執(zhí)行計(jì)劃是否正確,下面分享幾種查看執(zhí)行計(jì)劃的方法,每一種方法都各有各的好處,可以根據(jù)特定場(chǎng)景選擇某種方法,需要的朋友可以參考下

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)文章

最新評(píng)論