>進(jìn)入 什么是執(zhí)行計劃 所謂執(zhí)行計劃,顧名思義,就是對一個查詢?nèi)蝿?wù),做出一份怎樣去完成任務(wù)的詳細(xì)方案。舉個生活中的例子,我從珠海要去英國,我可以選擇先去香港然后轉(zhuǎn)機(jī),也可以先去北京轉(zhuǎn)機(jī),或者去 " />
歡迎進(jìn)入Oracle社區(qū)論壇,與200萬技術(shù)人員互動交流 >>進(jìn)入 什么是執(zhí)行計劃 所謂執(zhí)行計劃,顧名思義,就是對一個查詢?nèi)蝿?wù),做出一份怎樣去完成任務(wù)的詳細(xì)方案。舉個生活中的例子,我從珠海要去英國,我可以選擇先去香港然后轉(zhuǎn)機(jī),也可以先去北京轉(zhuǎn)機(jī),或者去
歡迎進(jìn)入Oracle社區(qū)論壇,與200萬技術(shù)人員互動交流 >>進(jìn)入
什么是執(zhí)行計劃
所謂執(zhí)行計劃,顧名思義,就是對一個查詢?nèi)蝿?wù),做出一份怎樣去完成任務(wù)的詳細(xì)方案。舉個生活中的例子,我從珠海要去英國,我可以選擇先去香港然后轉(zhuǎn)機(jī),也可以先去北京轉(zhuǎn)機(jī),或者去廣州也可以。但是到底怎樣去英國劃算,也就是我的費(fèi)用最少,這是一件值得考究的事情。同樣對于查詢而言,我們提交的SQL僅僅是描述出了我們的目的地是英國,但至于怎么去,通常我們的SQL中是沒有給出提示信息的,是由數(shù)據(jù)庫來決定的。
我們先簡單的看一個執(zhí)行計劃的對比:
SQL> set autotrace traceonly
執(zhí)行計劃一:
SQL> select count(*) from t;
COUNT(*)
----------
24815
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'T'
執(zhí)行計劃二:
SQL> select count(*) from t;
COUNT(*)
24815
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=26 Card=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FULL SCAN) OF 'T_INDEX' (NON-UNIQUE) (Cost=26 Card=28180)
這兩個執(zhí)行計劃中,第一個表示求和是通過進(jìn)行全表掃描來做的,把整個表中數(shù)據(jù)讀入內(nèi)存來逐條累加;第二個表示根據(jù)表中索引,把整個索引讀進(jìn)內(nèi)存來逐條累加,而不用去讀表中的數(shù)據(jù)。但是這兩種方式到底哪種快呢?通常來說可能二比一快,但也不是絕對的。這是一個很簡單的例子演示執(zhí)行計劃的差異。對于復(fù)雜的SQL(表連接、嵌套子查詢等),執(zhí)行計劃可能幾十種甚至上百種,但是到底那種最好呢?我們事前并不知道,數(shù)據(jù)庫本身也不知道,但是數(shù)據(jù)庫會根據(jù)一定的規(guī)則或者統(tǒng)計信息(statistics)去選擇一個執(zhí)行計劃,通常來說選擇的是比較優(yōu)的,但也有選擇失誤的時候,這就是這次討論的價值所在。
Oracle優(yōu)化器模式
Oracle優(yōu)化器有兩大類,基于規(guī)則的和基于代價的,在SQLPLUS中我們可以查看init文件中定義的缺省的優(yōu)化器模式。
SQL> show parameters optimizer_mode
NAME TYPE VALUE
optimizer_mode string CHOOSE
SQL>
這是Oracle8.1.7 企業(yè)版,我們可以看出,默認(rèn)安裝后數(shù)據(jù)庫優(yōu)化器模式為CHOOSE,我們還可以設(shè)置為 RULE、FIRST_ROWS,ALL_ROWS。可以在init文件中對整個instance的所有會話設(shè)置,也可以單獨(dú)對某個會話設(shè)置:
SQL> ALTER SESSION SET optimizer_mode = RULE;
會話已更改。
SQL> ALTER SESSION SET optimizer_mode = FIRST_ROWS;
會話已更改。
SQL> ALTER SESSION SET optimizer_mode = ALL_ROWS;
會話已更改。
[1] [2]
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com