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