簡(jiǎn)單談?wù)凮racle SQL調(diào)優(yōu)
Oracle還是比較常用的,于是我研究了一下Oracle SQL調(diào)優(yōu),在這里拿出來(lái)和大家分享一下,希望對(duì)大家有用。Oracle SQL調(diào)優(yōu)是一個(gè)復(fù)雜的主題,甚至是需要整本書來(lái)介紹Oracle SQL調(diào)優(yōu)的細(xì)微差別。不過(guò)有一些基本的規(guī)則是每個(gè)Oracle DBA都需要跟從的,這些規(guī)則可以改善他們系統(tǒng)的性能。SQL調(diào)優(yōu)的目標(biāo)是簡(jiǎn)單的:
◆消除不必要的大表全表搜索:不必要的全表搜索導(dǎo)致大量不必要的I/O,從而拖慢整個(gè)數(shù)據(jù)庫(kù)的性能。調(diào)優(yōu)專家首先會(huì)根據(jù)查詢返回的行數(shù)目來(lái)評(píng)價(jià) SQL。在一個(gè)有序的表中,如果查詢返回少于40%的行,或者在一個(gè)無(wú)序的表中,返回少于7%的行,那么這個(gè)查詢都可以調(diào)整為使用一個(gè)索引來(lái)代替全表搜索。對(duì)于不必要的全表搜索來(lái)說(shuō),最常見的調(diào)優(yōu)方法是增加索引??梢栽诒碇屑尤霕?biāo)準(zhǔn)的B樹索引,也可以加入bitmap和基于函數(shù)的索引。要決定是否消除一個(gè)全表搜索,你可以仔細(xì)檢查索引搜索的I/O開銷和全表搜索的開銷,它們的開銷和數(shù)據(jù)塊的讀取和可能的并行執(zhí)行有關(guān),并將兩者作對(duì)比。在一些情況下,一些不必要的全表搜索的消除可以通過(guò)強(qiáng)制使用一個(gè)index來(lái)達(dá)到,只需要在SQL語(yǔ)句中加入一個(gè)索引的提示就可以了。
◆在全表搜索是一個(gè)最快的訪問方法時(shí),將小表的全表搜索放到緩存中,調(diào)優(yōu)專家應(yīng)該確保有一個(gè)專門的數(shù)據(jù)緩沖用作行緩沖。在Oracle7中,你可以使用alter table xxx cache語(yǔ)句,在Oracle8或以上,小表可以被強(qiáng)制為放到KEEP池中緩沖。
◆確保最優(yōu)的索引使用:對(duì)于改善查詢的速度,這是特別重要的。有時(shí)Oracle可以選擇多個(gè)索引來(lái)進(jìn)行查詢,調(diào)優(yōu)專家必須檢查每個(gè)索引并且確保Oracle使用正確的索引。它還包括bitmap和基于函數(shù)的索引的使用。
◆確保最優(yōu)的JOIN操作:有些查詢使用NESTED LOOP join快一些,有些則是HASH join快一些,另外一些則是sort-merge join更快。
這些規(guī)則看來(lái)簡(jiǎn)單,不過(guò)它們占SQL調(diào)優(yōu)任務(wù)的90%,并且它們也無(wú)需完全懂得Oracle SQL的內(nèi)部運(yùn)作。這里我們來(lái)簡(jiǎn)單概覽一下Oracle SQL調(diào)優(yōu)。
【編輯推薦】