ORACLE基于SQL查詢優(yōu)化培訓(xùn)文檔_第1頁(yè)
ORACLE基于SQL查詢優(yōu)化培訓(xùn)文檔_第2頁(yè)
ORACLE基于SQL查詢優(yōu)化培訓(xùn)文檔_第3頁(yè)
ORACLE基于SQL查詢優(yōu)化培訓(xùn)文檔_第4頁(yè)
ORACLE基于SQL查詢優(yōu)化培訓(xùn)文檔_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

ORACLE基于SQL查詢優(yōu)化培訓(xùn)文檔2013年11月查詢優(yōu)化基本準(zhǔn)則詳解2ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最后的表(基礎(chǔ)表drivingtable)將被最先處理。在

FROM子句中包含多個(gè)表的情況下,你必須選擇記錄條數(shù)最少的表作為基礎(chǔ)表。例如:表TAB116384條記錄表TAB21條記錄選擇TAB2作為基礎(chǔ)表(最好的方法)selectcount(*)fromtab1,tab2執(zhí)行時(shí)間0.96秒選擇TAB2作為基礎(chǔ)表(不佳的方法)selectcount(*)fromtab2,tab1執(zhí)行時(shí)間26.09秒查詢優(yōu)化基本準(zhǔn)則詳解3ORACLE采用自下而上的順序解析WHERE子句,根據(jù)這個(gè)原理,表之間的連接必須寫在其他WHERE條件之前,那些可以過濾掉最大數(shù)量記錄的條件必須寫在WHERE子句的末尾。例如:(低效,執(zhí)行時(shí)間156.3秒)SELECT…FROMEMPEWHERESAL>50000ANDJOB=‘MANAGER'AND25<(SELECTCOUNT(*)FROMEMPWHEREMGR=E.EMPNO);(高效,執(zhí)行時(shí)間10.6秒)SELECT…FROMEMPEWHERE25<(SELECTCOUNT(*)FROMEMPWHEREMGR=E.EMPNO)ANDSAL>50000ANDJOB=‘MANAGER';在進(jìn)行多表關(guān)聯(lián)時(shí),多用Where語(yǔ)句把單個(gè)表的結(jié)果集最小化,多用聚合函數(shù)匯總結(jié)果集后再與其它表做關(guān)聯(lián),以使結(jié)果集數(shù)據(jù)量最小化查詢優(yōu)化基本準(zhǔn)則詳解4減少對(duì)表的查詢?cè)诤凶硬樵兊腟QL語(yǔ)句中,要特別注意減少對(duì)表的查詢例如:低效SELECTTAB_NAMEFROMTABLESWHERETAB_NAME=(SELECTTAB_NAMEFROMTAB_COLUMNSWHEREVERSION=604)ANDDB_VER=(SELECTDB_VERFROMTAB_COLUMNSWHEREVERSION=604)高效SELECTTAB_NAMEFROMTABLESWHERE(TAB_NAME,DB_VER)=(SELECTTAB_NAME,DB_VER)FROMTAB_COLUMNSWHEREVERSION=604)查詢優(yōu)化基本準(zhǔn)則詳解5用EXISTS替代IN在許多基于基礎(chǔ)表的查詢中,為了滿足一個(gè)條件,往往需要對(duì)另一個(gè)表進(jìn)行聯(lián)接。在這種情況下,使用EXISTS(或NOTEXISTS)通常將提高查詢的效率。使用exists而不用IN因?yàn)镋xists只檢查行的存在,而in檢查實(shí)際值例如:低效SELECT*FROMEMP(基礎(chǔ)表)WHEREEMPNO>0ANDDEPTNOIN(SELECTDEPTNOFROMDEPTWHERELOC=‘MELB')高效SELECT*FROMEMP(基礎(chǔ)表)WHEREEMPNO>0ANDEXISTS(SELECT‘X'FROMDEPTWHEREDEPT.DEPTNO=EMP.DEPTNOANDLOC=‘MELB')用IN的SQL性能總是比較低,原因是:對(duì)于用IN的SQL語(yǔ)句ORACLE總是試圖將其轉(zhuǎn)換成多個(gè)表的連接,如果轉(zhuǎn)換不成功則先執(zhí)行IN里面的子查詢,再查詢外層的表記錄如果轉(zhuǎn)換成功就轉(zhuǎn)換成多個(gè)表的連接。因此不管理怎么,用IN的SQL語(yǔ)句總是多了一個(gè)轉(zhuǎn)換的過程。因此在業(yè)務(wù)密集的SQL當(dāng)中盡量不采用IN操作符。查詢優(yōu)化基本準(zhǔn)則詳解6用NOTEXISTS替代NOTIN在子查詢中,NOTIN子句將執(zhí)行一個(gè)內(nèi)部的排序和合并。無(wú)論在哪種情況下,NOTIN都是最低效的(因?yàn)樗鼘?duì)子查詢中的表執(zhí)行了一個(gè)全表遍歷)。為了避免使用NOTIN,我們可以把它改寫成外連接(OuterJoins)或NOTEXISTS.例如:SELECT…FROMEMPWHEREDEPT_NONOTIN(SELECTDEPT_NOFROMDEPTWHEREDEPT_CAT='A');為了提高效率。改寫為:SELECT….FROMEMPEWHERENOTEXISTS(SELECT‘X'FROMDEPTDWHERED.DEPT_NO=E.DEPT_NOANDDEPT_CAT=‘A');NOTIN操作符此操作強(qiáng)烈推薦不使用,因?yàn)槠洳荒軕?yīng)用表的索引。如遇這種情況,應(yīng)該用EXISTS,NOTEXISTS方案代替。查詢優(yōu)化基本準(zhǔn)則詳解7用EXISTS替換DISTINCT當(dāng)提交一個(gè)包含一對(duì)多表信息(比如部門表和雇員表)的查詢時(shí),避免在

SELECT子句中使用DISTINCT.一般可以考慮用EXIST替換例如:低效:SELECTDISTINCTDEPT_NO,DEPT_NFROMDEPTD,EMPEWHERED.DEPT_NO=E.DEPT_NO高效:SELECTDEPT_NO,DEPT_NAMEFROMDEPTDWHEREEXISTS(SELECT‘X'FROMEMPEWHEREE.DEPT_NO=D.DEPT_NO);查詢優(yōu)化基本準(zhǔn)則詳解8用表連接替換EXISTS通常來說,采用表連接的方式比EXISTS更有效率例如:SELECTENAMEFROMEMPEWHEREEXISTS(SELECT‘X'FROMDEPTWHEREDEPT_NO=E.DEPT_NOANDDEPT_CAT=‘A');為了提高效率。改寫為:SELECTENAMEFROMDEPTD,EMPEWHEREE.DEPT_NO=D.DEPT_NOANDDEPT_CAT=‘A';查詢優(yōu)化基本準(zhǔn)則詳解9避免在索引列上使用計(jì)算WHERE子句中,如

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論