資源描述:
《oracle多表查詢優(yōu)化》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、ORACLE多表查詢優(yōu)化ORACLE多表查詢優(yōu)化時間:2009-10-2913:34:35來源:網(wǎng)絡作者:未知點擊:124次ORACLE多表查詢優(yōu)化這里提供的是執(zhí)行性能的優(yōu)化,而不是后臺數(shù)據(jù)庫優(yōu)化器資料:參考數(shù)據(jù)庫開發(fā)性能方面的各種問題,收集了一些優(yōu)化方案統(tǒng)計如下(當然,象索引等優(yōu)化方案太過簡單就不列入了,嘿嘿):ORACLE多表查詢優(yōu)化這里提供的是執(zhí)行性能的優(yōu)化,而不是后臺數(shù)據(jù)庫優(yōu)化器資料:參考數(shù)據(jù)庫開發(fā)性能方面的各種問題,收集了一些優(yōu)化方案統(tǒng)計如下(當然,象索引等優(yōu)化方案太過簡單就不列入了,嘿嘿):執(zhí)行路徑:ORACLE的這個功
2、能大大地提高了SQL的執(zhí)行性能并節(jié)省了內(nèi)存的使用:我們發(fā)現(xiàn),單表數(shù)據(jù)的統(tǒng)計比多表統(tǒng)計的速度完全是兩個概念.單表統(tǒng)計可能只要0.02秒,但是2張表聯(lián)合統(tǒng)計就可能要幾十表了.這是因為ORACLE只對簡單的表提供高速緩沖(cachebuffering),這個功能并不適用于多表連接查詢..數(shù)據(jù)庫管理員必須在init.ora中為這個區(qū)域設置合適的參數(shù),當這個內(nèi)存區(qū)域越大,就可以保留更多的語句,當然被共享的可能性也就越大了.當你向ORACLE提交一個SQL語句,ORACLE會首先在這塊內(nèi)存中查找相同的語句.這里需要注明的是,ORACLE對兩者采
3、取的是一種嚴格匹配,要達成共享,SQL語句必須完全相同(包括空格,換行等).共享的語句必須滿足三個條件:A.字符級的比較:當前被執(zhí)行的語句和共享池中的語句必須完全相同.例如:SELECT*FROMEMP;和下列每一個都不同SELECT*fromEMP;Select*FromEmp;SELECT*FROMEMP;B.兩個語句所指的對象必須完全相同:用戶對象名如何訪問Jacksal_limitprivatesynonymWork_citypublicsynonymPlant_detailpublicsynonymJillsal_limi
4、tprivatesynonymWork_citypublicsynonymPlant_detailtableowner考慮一下下列SQL語句能否在這兩個用戶之間共享.SQL能否共享原因selectmax(sal_cap)fromsal_limit;不能每個用戶都有一個privatesynonym-sal_limit,它們是不同的對象selectcount(*)fromwork_citywheresdesclike'NEW%';能兩個用戶訪問相同的對象publicsynonym-work_cityselecta.sdesc,b.loc
5、ationfromwork_citya,plant_detailbwherea.city_id=b.city_id不能用戶jack通過privatesynonym訪問plant_detail而jill是表的所有者,對象不同.C.兩個SQL語句中必須使用相同的名字的綁定變量(bindvariables)例如:第一組的兩個SQL語句是相同的(可以共享),而第二組中的兩個語句是不同的(即使在運行時,賦于不同的綁定變量相同的值)a.selectpin,namefrompeoplewherepin=:blk1.pin;selectpin,na
6、mefrompeoplewherepin=:blk1.pin;b.selectpin,namefrompeoplewherepin=:blk1.ot_ind;selectpin,namefrompeoplewherepin=:blk1.ov_ind;重點關(guān)注1:選擇最有效率的表名順序(只在基于規(guī)則的優(yōu)化器中有效)重點關(guān)注ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最后的表(基礎表drivingtable)將被最先處理.在FROM子句中包含多個表的情況下,你必須選擇記錄條數(shù)最少的表作為基礎表.
7、當ORACLE處理多個表時,會運用排序及合并的方式連接它們.首先,掃描第一個表(FROM子句中最后的那個表)并對記錄進行派序,然后掃描第二個表(FROM子句中最后第二個表),最后將所有從第二個表中檢索出的記錄與第一個表中合適記錄進行合并.例如:表TAB116,384條記錄表TAB21條記錄選擇TAB2作為基礎表(最好的方法)selectcount(*)fromtab1,tab2執(zhí)行時間0.96秒選擇TAB2作為基礎表(不佳的方法)selectcount(*)fromtab2,tab1執(zhí)行時間26.09秒如果有3個以上的表連接查詢,那
8、就需要選擇交叉表(intersectiontable)作為基礎表,交叉表是指那個被其他表所引用的表.例如:EMP表描述了LOCATION表和CATEGORY表的交集.SELECT*FROMLOCATIONL,CATEGORYC,EMP