oracle函数lp,Oracle 执行计划的查看方式
訪問數(shù)據(jù)的方法:一、訪問表的方法:1.全表掃描,2.ROWID掃描
二、訪問索引的方法:1.索引唯一性掃描,2.索引范圍掃描,3.索引全掃描,4.索引快速全掃描,5.索引跳躍式掃描
表連接:1.排序合并連接,2.嵌套循環(huán)連接,3.哈希連接,4.反連接,5.半連接,6.星型連接(多用于數(shù)據(jù)倉庫,是一種單個事實表和多個維度表之間的連接,事實表和維度表之間是基于事實表的外鍵列和對應維度表的主鍵之間的連接)
執(zhí)行計劃:
方式一、explain plan
SQL>?explain?plan?for?select?empno,ename,dname?from?scott.emp,scott.dept?where?emp.deptno?=?dept.deptno;
Explained
SQL>?select?*?from?table(dbms_xplan.display);
方式二、DBMS_XPLAN 包
針對不同的場景,可以選擇四種不同的方法中的一種:
1.select * from table(dbms_xplan.display)
這需要和explain plan 配合使用,上面已經(jīng)展示
2.select * from table(dbms_xplan.display_cursor(null,null,'advanced'))
用于在sqlplus中查看剛剛執(zhí)行過的sql的執(zhí)行計劃,第三個參數(shù)還可為all,只是第三個參數(shù)是advanced結(jié)果會更詳細
3.select * from table(dbms_xplan.display_cursor('sql_id/hash_value',child_cursor_number,'advanced'))
用于查看指定sql的執(zhí)行計劃,sql_id/hash_value和child_cursor_number可從v$sql視圖中找到:
select sql_text,sql_id,hash_value,child_number from v$sql where sql_text like 'SQL';
只要目標SQL的執(zhí)行計劃所在的Child Cursor還么有被age out出Share Pool,就可以使用此方法。
4.select * from table(dbms_xplan.display_awr('sql_id'))
用于查看指定sql的所有歷史執(zhí)行計劃。 方法2和3能夠顯示目標SQL執(zhí)行計劃的前提條件是該SQL還在Share Pool中,如果已經(jīng)被age out出Share Pool,那么只要該SQL的執(zhí)行計劃被Oracle采集到AWR Repository中,我們就可以使用方法4來查看該SQL的所有執(zhí)行計劃。
select sql_text,sql_id,version_count,executions from v$sqlarea where sql_text like 'SQL';
version_count可以看出該SQL有幾個Child Cursor。
和方法2和3相比,有個不好的地方是看不到執(zhí)行步驟對應的謂詞條件
方法三、AUTOTRACE開關(guān)
在sqlplus中將AUTOTRACE開關(guān)打開也能得到目標sql的執(zhí)行計劃,還能額外觀察到目標SQL執(zhí)行所消耗的物理讀、邏輯讀、產(chǎn)生redo的數(shù)量以及排序的數(shù)量。
SET AUTOTRACE {OFF|ON|TRACEONLY}
[EXPLAIN]
[STATISTICS]
SESSION默認是SET AUTOTRACE OFF
1.在當前SESSION中執(zhí)行SET AUTOTRACE ON 可以在當前session中打開AUTOTRACE開關(guān),這樣,這個SESSION中隨后執(zhí)行的所有SQL除了顯示SQL執(zhí)行結(jié)果之外,還會額外顯示SQL所對應的執(zhí)行計劃和資源消耗情況。
2.在當前SESSION中執(zhí)行SET AUTOTRACE TRACEONLY,可以在當前SESSION中只顯示SQL執(zhí)行計劃和額外消耗,而不顯示結(jié)果。
3.在當前SESSION中執(zhí)行SET AUTOTRACE TRACEONLY EXPLAIN可以在當前SESSION中只顯示執(zhí)行計劃(SELECT不會被實際執(zhí)行,DML語句會被實際執(zhí)行)
4.在當前SESSION中執(zhí)行SET AUTOTRACE TRACEONLYSTATISTICS可以在當前SESSION中只顯示資源消耗
方法四、10046事件與tkprof命令
10046事件與上面三種的不同之處在于,所得到的執(zhí)行計劃中明確顯示了目標SQL實行執(zhí)行計劃中每一個執(zhí)行步驟所消耗的邏輯讀、物理讀和花費時間。
< 略 >
除了第四種方法外,前三種的方法得到的執(zhí)行計劃有可能是不準確的,要判斷執(zhí)行計劃是否準確,就是看目標SQL是否真正被執(zhí)行過,真正被實際執(zhí)行過的SQL得到的執(zhí)行計劃準確。(此原則不適用于AUTOTRACE開關(guān),因為所有使用AUTOTRACE開關(guān)所顯示的執(zhí)行計劃都有可能是不準確的,即使對應的目標SQL已經(jīng)被執(zhí)行過,因為使用SET AUTOTRACE命令所顯示的執(zhí)行計劃來源都是調(diào)用explain plan命令)
第一種方法得到的執(zhí)行計劃,目標SQL是沒有被被實際執(zhí)行過的,執(zhí)行計劃可能是不準確的尤其是目標SQL包含綁定變量時。
第二種方法的 2,3,4 得到的執(zhí)行計劃是準確的,因為此時目標SQL已經(jīng)被實際執(zhí)行過。
cuihua查看真實執(zhí)行計劃的腳本用法
9i: @'e:\xxx' sql_id child_cursor_number ?--適合于9i之前數(shù)據(jù)庫
printsql: 在數(shù)據(jù)庫服務器上執(zhí)行 topas命令后顯示 SPID為1234的Oracle進程占用了14%CPU,查看這進程在做什么:
exec printsql(1234,'SPID')
printsql可幫把這個進程正在執(zhí)行的SQL,該SQL真實的執(zhí)行計劃以及殺這個Session的語句打印出來
查看執(zhí)行計劃順序口訣:先從最開頭一直連續(xù)往右看,直到看到最右邊的并列的地方;對于不并列的,靠右的先執(zhí)行;如果見到并列的,就從上往下看,對于并列的部分,考上的先執(zhí)行。
cuihua 查看執(zhí)行順序的腳本
xplan包
select * from table(xplan.display_cursor('sql_id',child_number,'advanced'));
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的oracle函数lp,Oracle 执行计划的查看方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS如何比较两个字符串
- 下一篇: linux ftp命令大全,linuxf