資源描述:
《oraclesql性能優(yōu)化調(diào)整》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、Oraclesql性能優(yōu)化調(diào)整1.選用適合的ORACLE優(yōu)化器?ORACLE的優(yōu)化器共有3種:a.RULE(基于規(guī)則)b.COST(基于成本)c.CHOOSE(選擇性)?設(shè)置缺省的優(yōu)化器,可以通過對(duì)init.ora文件中OPTIMIZER_MODE參數(shù)的各種聲明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS.你當(dāng)然也在SQL句級(jí)或是會(huì)話(session)級(jí)對(duì)其進(jìn)行覆蓋.為了使用基于成本的優(yōu)化器(CBO,Cost-BasedOptimizer),你必須經(jīng)常運(yùn)行analyze命令,以增加數(shù)據(jù)庫(kù)中的對(duì)象統(tǒng)計(jì)信息(objectstatisti
2、cs)的準(zhǔn)確性.如果數(shù)據(jù)庫(kù)的優(yōu)化器模式設(shè)置為選擇性(CHOOSE),那么實(shí)際的優(yōu)化器模式將和是否運(yùn)行過analyze命令有關(guān).如果table已經(jīng)被analyze過,優(yōu)化器模式將自動(dòng)成為CBO,反之,數(shù)據(jù)庫(kù)將采用RULE形式的優(yōu)化器.在缺省情況下,ORACLE采用CHOOSE優(yōu)化器,為了避免那些不必要的全表掃描(fulltablescan),你必須盡量避免使用CHOOSE優(yōu)化器,而直接采用基于規(guī)則或者基于成本的優(yōu)化器.2.??????訪問Table的方式ORACLE采用兩種訪問表中記錄的方式:a.??????全表掃描全表掃描就是順序地訪問表中每條記錄.ORACLE采
3、用一次讀入多個(gè)數(shù)據(jù)塊(databaseblock)的方式優(yōu)化全表掃描.b.??????通過ROWID訪問表你可以采用基于ROWID的訪問方式情況,提高訪問表的效率,,ROWID包含了表中記錄的物理位置信息..ORACLE采用索引(INDEX)實(shí)現(xiàn)了數(shù)據(jù)和存放數(shù)據(jù)的物理位置(ROWID)之間的聯(lián)系.通常索引提供了快速訪問ROWID的方法,因此那些基于索引列的查詢就可以得到性能上的提高.?3.??????共享SQL語(yǔ)句為了不重復(fù)解析相同的SQL語(yǔ)句,在第一次解析之后,ORACLE將SQL語(yǔ)句存放在內(nèi)存中.這塊位于系統(tǒng)全局區(qū)域SGA(systemglobalarea)的
4、共享池(sharedbufferpool)中的內(nèi)存可以被所有的數(shù)據(jù)庫(kù)用戶共享.因此,當(dāng)你執(zhí)行一個(gè)SQL語(yǔ)句(有時(shí)被稱為一個(gè)游標(biāo))時(shí),如果它和之前的執(zhí)行過的語(yǔ)句完全相同,ORACLE就能很快獲得已經(jīng)被解析的語(yǔ)句以及最好的執(zhí)行路徑.ORACLE的這個(gè)功能大大地提高了SQL的執(zhí)行性能并節(jié)省了內(nèi)存的使用.可惜的是ORACLE只對(duì)簡(jiǎn)單的表提供高速緩沖(cachebuffering),這個(gè)功能并不適用于多表連接查詢.數(shù)據(jù)庫(kù)管理員必須在init.ora中為這個(gè)區(qū)域設(shè)置合適的參數(shù),當(dāng)這個(gè)內(nèi)存區(qū)域越大,就可以保留更多的語(yǔ)句,當(dāng)然被共享的可能性也就越大了.當(dāng)你向ORACLE提交一個(gè)S
5、QL語(yǔ)句,ORACLE會(huì)首先在這塊內(nèi)存中查找相同的語(yǔ)句.這里需要注明的是,ORACLE對(duì)兩者采取的是一種嚴(yán)格匹配,要達(dá)成共享,SQL語(yǔ)句必須完全相同(包括空格,換行等).共享的語(yǔ)句必須滿足三個(gè)條件:?A.?????字符級(jí)的比較:當(dāng)前被執(zhí)行的語(yǔ)句和共享池中的語(yǔ)句必須完全相同.例如:SELECT*FROMEMP;和下列每一個(gè)都不同SELECT*fromEMP;Select*FromEmp;SELECT*FROMEMP;B.?????兩個(gè)語(yǔ)句所指的對(duì)象必須完全相同:例如:用戶對(duì)象名如何訪問Jacksal_limitprivatesynonymWork_citypubli
6、csynonymPlant_detailpublicsynonymJillsal_limitprivatesynonymWork_citypublicsynonymPlant_detailtableowner?考慮一下下列SQL語(yǔ)句能否在這兩個(gè)用戶之間共享.?SQL能否共享原因selectmax(sal_cap)fromsal_limit;不能每個(gè)用戶都有一個(gè)privatesynonym-sal_limit,它們是不同的對(duì)象selectcount(*0fromwork_citywheresdesclike'NEW%';能兩個(gè)用戶訪問相同的對(duì)象publicsynon
7、ym-work_cityselecta.sdesc,b.locationfromwork_citya,plant_detailbwherea.city_id=b.city_id不能用戶jack通過privatesynonym訪問plant_detail而jill是表的所有者,對(duì)象不同.?C.?????兩個(gè)SQL語(yǔ)句中必須使用相同的名字的綁定變量(bindvariables)例如:第一組的兩個(gè)SQL語(yǔ)句是相同的(可以共享),而第二組中的兩個(gè)語(yǔ)句是不同的(即使在運(yùn)行時(shí),賦于不同的綁定變量相同的值)a.selectpin,namefrompeoplewherepin=:
8、blk1.