ORACLESQL性能優(yōu)化系列(十四)完結(jié)篇

字號(hào):

46. 連接多個(gè)掃描
    如果你對(duì)一個(gè)列和一組有限的值進(jìn)行比較, 優(yōu)化器可能執(zhí)行多次掃描并對(duì)結(jié)果進(jìn)行合并連接.
    舉例:
     SELECT *
     FROM LODGING
     WHERE MANAGER IN (‘BILL GATES’,’KEN MULLER’);
     優(yōu)化器可能將它轉(zhuǎn)換成以下形式
     SELECT *
     FROM LODGING
     WHERE MANAGER = ‘BILL GATES’
     OR MANAGER = ’KEN MULLER’;
     當(dāng)選擇執(zhí)行路徑時(shí), 優(yōu)化器可能對(duì)每個(gè)條件采用LODGING$MANAGER上的索引范圍掃描. 返回的ROWID用來(lái)訪問(wèn)LODGING表的記錄 (通過(guò)TABLE ACCESS BY ROWID 的方式). 最后兩組記錄以連接(CONCATENATION)的形式被組合成一個(gè)單一的集合.
    Explain Plan :
    SELECT STATEMENT Optimizer=CHOOSE
     CONCATENATION
     TABLE ACCESS (BY INDEX ROWID) OF LODGING
     INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE)
     TABLE ACCESS (BY INDEX ROWID) OF LODGING
     INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE)
    譯者按:
    本節(jié)和第37節(jié)似乎有矛盾之處.
    47. CBO下使用更具選擇性的索引
    基于成本的優(yōu)化器(CBO, Cost-Based Optimizer)對(duì)索引的選擇性進(jìn)行判斷來(lái)決定索引的使用是否能提高效率.
    如果索引有很高的選擇性, 那就是說(shuō)對(duì)于每個(gè)不重復(fù)的索引鍵值,只對(duì)應(yīng)數(shù)量很少的記錄.
    比如, 表中共有100條記錄而其中有80個(gè)不重復(fù)的索引鍵值. 這個(gè)索引的選擇性就是80/100 = 0.8 . 選擇性越高, 通過(guò)索引鍵值檢索出的記錄就越少.
    如果索引的選擇性很低, 檢索數(shù)據(jù)就需要大量的索引范圍查詢操作和ROWID 訪問(wèn)表的
    操作. 也許會(huì)比全表掃描的效率更低.
    譯者按:
    下列經(jīng)驗(yàn)請(qǐng)參閱:
    a. 如果檢索數(shù)據(jù)量超過(guò)30%的表中記錄數(shù).使用索引將沒(méi)有顯著的效率提高.
    b. 在特定情況下, 使用索引也許會(huì)比全表掃描慢, 但這是同一個(gè)數(shù)量級(jí)上的
    區(qū)別. 而通常情況下,使用索引比全表掃描要塊幾倍乃至幾千倍!
    48. 避免使用耗費(fèi)資源的操作
    帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語(yǔ)句會(huì)啟動(dòng)SQL引擎
    執(zhí)行耗費(fèi)資源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要執(zhí)行兩次排序.
    例如,一個(gè)UNION查詢,其中每個(gè)查詢都帶有GROUP BY子句, GROUP BY會(huì)觸發(fā)嵌入排序(NESTED SORT) ; 這樣, 每個(gè)查詢需要執(zhí)行一次排序, 然后在執(zhí)行UNION時(shí), 又一個(gè)排序(SORT UNIQUE)操作被執(zhí)行而且它只能在前面的嵌入排序結(jié)束后才能開(kāi)始執(zhí)行. 嵌入的排序的深度會(huì)大大影響查詢的效率.
    通常, 帶有UNION, MINUS , INTERSECT的SQL語(yǔ)句都可以用其他方式重寫(xiě).
    譯者按:
     如果你的數(shù)據(jù)庫(kù)的SORT_AREA_SIZE調(diào)配得好, 使用UNION , MINUS, INTERSECT也是可以考慮的, 畢竟它們的可讀性很強(qiáng)
    49. 優(yōu)化GROUP BY
    提高GROUP BY 語(yǔ)句的效率, 可以通過(guò)將不需要的記錄在GROUP BY 之前過(guò)濾掉.下面兩個(gè)查詢返回相同結(jié)果但第二個(gè)明顯就快了許多.
    低效:
     SELECT JOB , AVG(SAL)
     FROM EMP
     GROUP JOB
     HAVING JOB = ‘PRESIDENT’
     OR JOB = ‘MANAGER’
     高效:
     SELECT JOB , AVG(SAL)
     FROM EMP
     WHERE JOB = ‘PRESIDENT’
     OR JOB = ‘MANAGER’
     GROUP JOB