ORACLE 执行计划2
生活随笔
收集整理的這篇文章主要介紹了
ORACLE 执行计划2
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
SQL>set timing on?????????????????????????????????? --顯示Elapsed執(zhí)行總時間。區(qū)別于set time on
方式一:
SQL>set autotrace on/off???????????????????????? --顯示結(jié)果集、執(zhí)行計劃和統(tǒng)計信息(執(zhí)行SQL)
SQL>set autotrace?traceonly??????????????????? --顯示執(zhí)行計劃和統(tǒng)計信息, 不顯示結(jié)果集(執(zhí)行SQL)
SQL>set autotrace traceonly explain??????? --只顯示執(zhí)行計劃(不執(zhí)行SQL)
SQL>set autotrace?traceonly statistics???? --只顯示統(tǒng)計信息(不執(zhí)行SQL)
SQL>SELECT * FRM T_BD_ACCOUNTVIEW;
方式二:
SQL>explan plan for select * from t_bd_accountview;
SQL>SELECT plan_table_output FROM table(DBMS_XPLAN.DISPLAY('t_bd_accountview'));
SQL>SELECT * FROM table(dbms_xplan.display);
方式三:
SQL>alter session set SQL_TRACE=true;
SQL>SELECT sid, serial#, username from v$session where username = 'xxxx'
SQL>exec dbms_system.set_SQL_TRACE_in_session(sid, serial#,true/false)
--跟蹤其它用戶
SQL>alter session set events '10046 trace name context forever, level 8')?? //or '10046 trace name context off'
SQL>exec dbms_system.set_ev(sid, serial#,10046, 0-8(level), username);
執(zhí)行計劃中的字段解釋:
ID:一個序號,但不是執(zhí)行的先后順序。執(zhí)行的先后順序根據(jù)縮進(jìn)來判斷
Operation:當(dāng)前操作的內(nèi)容
Rows:當(dāng)前操作的cardinality, Oracle根據(jù)CBO估算當(dāng)前操作返回的結(jié)果集
Cost(CPU):Oracle計算出來的一個數(shù)值(代價), 用于說明SQL執(zhí)行的代價
Time: oracle估計當(dāng)前操作的時間
謂詞說明:
Access:影響數(shù)據(jù)的訪問路徑(表還是索引)
Filter:只起過濾數(shù)據(jù)的作用。
explain plan各列的含義:
ID_PLUS_EXP
PARENT_ID_PLUS_EXP
PLAN_PLUS_EXP
OBJECT_NODE_PLUS_EXP
Statistics各列含義:
db block gets???????? --從buffer cache中讀取的block數(shù)量
constient gets??????--從buffer cache中讀取的undo數(shù)據(jù)的block數(shù)量
?????????????????????????????????---because of查詢過程中,由于其它回話對數(shù)據(jù)塊進(jìn)行了操作,而對所要查詢的塊有了修改。讀取其以保證一致性。
physical reads???? --從磁盤讀取的block的數(shù)量
redo size????????????? --DML生成的redo的大小 ( 重做數(shù)——執(zhí)行SQL的過程中,產(chǎn)生的重做日志的大小)
sorts(memory)?????--在內(nèi)存執(zhí)行的排序量
sorts(dis)?????????????--在磁盤執(zhí)行的排序量
邏輯讀:db block gets + constient gets
物理讀:physical reads
緩沖區(qū)使用的命中率 = 1 - 物理讀 / (緩沖塊讀+緩沖undo讀)
SQL>SELECT name, value FROM v$sysstat WHERE name IN('db block gets', 'consistent gets', 'physical reads');
如果buffer cache的命中率在90%以上,否則需要增加數(shù)據(jù)緩沖區(qū)的大小
動態(tài)分析
如果執(zhí)行計劃中出現(xiàn)提示:
--dynamic sampling used for the statement
表示用戶使用了動態(tài)采樣技術(shù)CBO模式下。===>從而推斷這個表可能沒有做過分析,可有導(dǎo)致兩種現(xiàn)象:
1.該表沒有做過分析,CBO采用動態(tài)采樣分析數(shù)據(jù),也可以得出正確的執(zhí)行計劃
2.分析信息過舊,CBO不會動態(tài)采樣,采用舊的信息,從而導(dǎo)致錯誤的執(zhí)行計劃。
方式一:
SQL>set autotrace on/off???????????????????????? --顯示結(jié)果集、執(zhí)行計劃和統(tǒng)計信息(執(zhí)行SQL)
SQL>set autotrace?traceonly??????????????????? --顯示執(zhí)行計劃和統(tǒng)計信息, 不顯示結(jié)果集(執(zhí)行SQL)
SQL>set autotrace traceonly explain??????? --只顯示執(zhí)行計劃(不執(zhí)行SQL)
SQL>set autotrace?traceonly statistics???? --只顯示統(tǒng)計信息(不執(zhí)行SQL)
SQL>SELECT * FRM T_BD_ACCOUNTVIEW;
方式二:
SQL>explan plan for select * from t_bd_accountview;
SQL>SELECT plan_table_output FROM table(DBMS_XPLAN.DISPLAY('t_bd_accountview'));
SQL>SELECT * FROM table(dbms_xplan.display);
方式三:
SQL>alter session set SQL_TRACE=true;
SQL>SELECT sid, serial#, username from v$session where username = 'xxxx'
SQL>exec dbms_system.set_SQL_TRACE_in_session(sid, serial#,true/false)
--跟蹤其它用戶
SQL>alter session set events '10046 trace name context forever, level 8')?? //or '10046 trace name context off'
SQL>exec dbms_system.set_ev(sid, serial#,10046, 0-8(level), username);
執(zhí)行計劃中的字段解釋:
ID:一個序號,但不是執(zhí)行的先后順序。執(zhí)行的先后順序根據(jù)縮進(jìn)來判斷
Operation:當(dāng)前操作的內(nèi)容
Rows:當(dāng)前操作的cardinality, Oracle根據(jù)CBO估算當(dāng)前操作返回的結(jié)果集
Cost(CPU):Oracle計算出來的一個數(shù)值(代價), 用于說明SQL執(zhí)行的代價
Time: oracle估計當(dāng)前操作的時間
謂詞說明:
Access:影響數(shù)據(jù)的訪問路徑(表還是索引)
Filter:只起過濾數(shù)據(jù)的作用。
explain plan各列的含義:
ID_PLUS_EXP
PARENT_ID_PLUS_EXP
PLAN_PLUS_EXP
OBJECT_NODE_PLUS_EXP
Statistics各列含義:
db block gets???????? --從buffer cache中讀取的block數(shù)量
constient gets??????--從buffer cache中讀取的undo數(shù)據(jù)的block數(shù)量
?????????????????????????????????---because of查詢過程中,由于其它回話對數(shù)據(jù)塊進(jìn)行了操作,而對所要查詢的塊有了修改。讀取其以保證一致性。
physical reads???? --從磁盤讀取的block的數(shù)量
redo size????????????? --DML生成的redo的大小 ( 重做數(shù)——執(zhí)行SQL的過程中,產(chǎn)生的重做日志的大小)
sorts(memory)?????--在內(nèi)存執(zhí)行的排序量
sorts(dis)?????????????--在磁盤執(zhí)行的排序量
邏輯讀:db block gets + constient gets
物理讀:physical reads
緩沖區(qū)使用的命中率 = 1 - 物理讀 / (緩沖塊讀+緩沖undo讀)
SQL>SELECT name, value FROM v$sysstat WHERE name IN('db block gets', 'consistent gets', 'physical reads');
如果buffer cache的命中率在90%以上,否則需要增加數(shù)據(jù)緩沖區(qū)的大小
動態(tài)分析
如果執(zhí)行計劃中出現(xiàn)提示:
--dynamic sampling used for the statement
表示用戶使用了動態(tài)采樣技術(shù)CBO模式下。===>從而推斷這個表可能沒有做過分析,可有導(dǎo)致兩種現(xiàn)象:
1.該表沒有做過分析,CBO采用動態(tài)采樣分析數(shù)據(jù),也可以得出正確的執(zhí)行計劃
2.分析信息過舊,CBO不會動態(tài)采樣,采用舊的信息,從而導(dǎo)致錯誤的執(zhí)行計劃。
總結(jié)
以上是生活随笔為你收集整理的ORACLE 执行计划2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何看懂ORACLE执行计划
- 下一篇: RAC IP 地址修改