資源描述:
《oracle+sql性能優(yōu)化系列》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、CSDN-文檔中心-數(shù)據(jù)庫開發(fā)????<>標(biāo)題????ORACLESQL性能優(yōu)化系列(十四)完結(jié)篇????black_snail(翻譯)關(guān)鍵字????ORACLEPERFORMANCETUNINGPL/SQL出處????http://www.dbasupport.com46.??????連接多個掃描如果你對一個列和一組有限的值進(jìn)行比較,優(yōu)化器可能執(zhí)行多次掃描并對結(jié)果進(jìn)行合并連接.舉例:SELECT*FROMLODGINGWHEREMANAGERIN(‘BILLGATES’,’KENMULLER’);?優(yōu)化器可能將它轉(zhuǎn)換成以下形式SELECT*FROMLODGINGW
2、HEREMANAGER=‘BILLGATES’ORMANAGER=’KENMULLER’;當(dāng)選擇執(zhí)行路徑時,優(yōu)化器可能對每個條件采用LODGING$MANAGER上的索引范圍掃描.返回的ROWID用來訪問LODGING表的記錄(通過TABLEACCESSBYROWID的方式).最后兩組記錄以連接(CONCATENATION)的形式被組合成一個單一的集合.?ExplainPlan:?SELECTSTATEMENTOptimizer=CHOOSECONCATENATIONTABLEACCESS(BYINDEXROWID)OFLODGINGINDEX(RANGESCAN)
3、OFLODGING$MANAGER(NON-UNIQUE)TABLEACCESS(BYINDEXROWID)OFLODGINGINDEX(RANGESCAN)OFLODGING$MANAGER(NON-UNIQUE)譯者按:本節(jié)和第37節(jié)似乎有矛盾之處.??47.??????CBO下使用更具選擇性的索引基于成本的優(yōu)化器(CBO,Cost-BasedOptimizer)對索引的選擇性進(jìn)行判斷來決定索引的使用是否能提高效率.如果索引有很高的選擇性,那就是說對于每個不重復(fù)的索引鍵值,只對應(yīng)數(shù)量很少的記錄.比如,表中共有100條記錄而其中有80個不重復(fù)的索引鍵值.這個索引的
4、選擇性就是80/100=0.8.選擇性越高,通過索引鍵值檢索出的記錄就越少.如果索引的選擇性很低,檢索數(shù)據(jù)就需要大量的索引范圍查詢操作和ROWID?訪問表的操作.也許會比全表掃描的效率更低.譯者按:下列經(jīng)驗請參閱:a.??????如果檢索數(shù)據(jù)量超過30%的表中記錄數(shù).使用索引將沒有顯著的效率提高.b.??????在特定情況下,使用索引也許會比全表掃描慢,但這是同一個數(shù)量級上的區(qū)別.而通常情況下,使用索引比全表掃描要塊幾倍乃至幾千倍!??48.??????避免使用耗費資源的操作帶有DISTINCT,UNION,MINUS,INTERSECT,ORDERBY的SQL語句
5、會啟動SQL引擎執(zhí)行耗費資源的排序(SORT)功能.DISTINCT需要一次排序操作,而其他的至少需要執(zhí)行兩次排序.例如,一個UNION查詢,其中每個查詢都帶有GROUPBY子句,GROUPBY會觸發(fā)嵌入排序(NESTEDSORT);這樣,每個查詢需要執(zhí)行一次排序,然后在執(zhí)行UNION時,又一個唯一排序(SORTUNIQUE)操作被執(zhí)行而且它只能在前面的嵌入排序結(jié)束后才能開始執(zhí)行.嵌入的排序的深度會大大影響查詢的效率.通常,帶有UNION,MINUS,INTERSECT的SQL語句都可以用其他方式重寫.譯者按:如果你的數(shù)據(jù)庫的SORT_AREA_SIZE調(diào)配得好,使
6、用UNION,MINUS,INTERSECT也是可以考慮的,畢竟它們的可讀性很強(qiáng)??49.??????優(yōu)化GROUPBY提高GROUPBY語句的效率,可以通過將不需要的記錄在GROUPBY之前過濾掉.下面兩個查詢返回相同結(jié)果但第二個明顯就快了許多.?低效:SELECTJOB,AVG(SAL)FROMEMPGROUPJOBHAVINGJOB=‘PRESIDENT’ORJOB=‘MANAGER’高效:SELECTJOB,AVG(SAL)FROMEMPWHEREJOB=‘PRESIDENT’ORJOB=‘MANAGER’GROUPJOB譯者按:本節(jié)和14節(jié)相同.可略過.?
7、50.??????使用日期當(dāng)使用日期是,需要注意如果有超過5位小數(shù)加到日期上,這個日期會進(jìn)到下一天!?例如:1.SELECTTO_DATE(‘01-JAN-93’+.99999)FROMDUAL;?Returns:’01-JAN-9323:59:59’2.SELECTTO_DATE(‘01-JAN-93’+.999999)FROMDUAL;?Returns:’02-JAN-9300:00:00’?譯者按:雖然本節(jié)和SQL性能優(yōu)化沒有關(guān)系,但是作者的功力可見一斑51.??使用顯式的游標(biāo)(CURSORs)使用隱式的游標(biāo),將會執(zhí)行兩次操作.第一次檢索記錄,第二次檢查T