Vincent.Chan‘s Blog

          常用鏈接

          統計

          積分與排名

          網站

          最新評論

          ORACLE SQL性能優化系列 (四)

          ORACLE SQL性能優化系列 (四)

          作者: black_snail

           

          關鍵字 ORACLE SQL PERFORMANCE TUNING

          出處 http://WWW.DBASUPPORT.COM



          13. 計算記錄條數

          和一般的觀點相反, count(*) 比count(1)稍快 , 當然如果可以通過索引檢索,對索引列的計數仍舊是最快的. 例如 COUNT(EMPNO)


          (譯者按: 在CSDN論壇中,曾經對此有過相當熱烈的討論, 作者的觀點并不十分準確,通過實際的測試,上述三種方法并沒有顯著的性能差別)


          14. 用Where子句替換HAVING子句


          避免使用HAVING子句, HAVING 只會在檢索出所有記錄之后才對結果集進行過濾. 這個處理需要排序,總計等操作. 如果能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷.


          例如:


          低效:

          SELECT REGION,AVG(LOG_SIZE)

          FROM LOCATION

          GROUP BY REGION

          HAVING REGION REGION != ‘SYDNEY'

          AND REGION != ‘PERTH'


          高效

          SELECT REGION,AVG(LOG_SIZE)

          FROM LOCATION

          WHERE REGION REGION != ‘SYDNEY'

          AND REGION != ‘PERTH'

          GROUP BY REGION

          (譯者按: HAVING 中的條件一般用于對一些集合函數的比較,如COUNT() 等等. 除此而外,一般的條件應該寫在WHERE子句中)


          15. 減少對表的查詢

          在含有子查詢的SQL語句中,要特別注意減少對表的查詢.


          例如:

          低效

          SELECT TAB_NAME

          FROM TABLES

          WHERE TAB_NAME = ( SELECT TAB_NAME

          FROM TAB_COLUMNS

          WHERE VERSION = 604)

          AND DB_VER= ( SELECT DB_VER

          FROM TAB_COLUMNS

          WHERE VERSION = 604)


          高效

          SELECT TAB_NAME

          FROM TABLES

          WHERE (TAB_NAME,DB_VER)

          = ( SELECT TAB_NAME,DB_VER)

          FROM TAB_COLUMNS

          WHERE VERSION = 604)


          Update 多個Column 例子:

          低效:

          UPDATE EMP

          SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),

          SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)

          WHERE EMP_DEPT = 0020;


          高效:

          UPDATE EMP

          SET (EMP_CAT, SAL_RANGE)

          = (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)

          FROM EMP_CATEGORIES)

          WHERE EMP_DEPT = 0020;



          16. 通過內部函數提高SQL效率.


          SELECT H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*)

          FROM HISTORY_TYPE T,EMP E,EMP_HISTORY H

          WHERE H.EMPNO = E.EMPNO

          AND H.HIST_TYPE = T.HIST_TYPE

          GROUP BY H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;


          通過調用下面的函數可以提高效率.

          FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN VARCHAR2

          AS

          TDESC VARCHAR2(30);

          CURSOR C1 IS

          SELECT TYPE_DESC

          FROM HISTORY_TYPE

          WHERE HIST_TYPE = TYP;

          BEGIN

          OPEN C1;

          FETCH C1 INTO TDESC;

          CLOSE C1;

          RETURN (NVL(TDESC,'?'));

          END;


          FUNCTION LOOKUP_EMP(EMP IN NUMBER) RETURN VARCHAR2

          AS

          ENAME VARCHAR2(30);

          CURSOR C1 IS

          SELECT ENAME

          FROM EMP

          WHERE EMPNO=EMP;

          BEGIN

          OPEN C1;

          FETCH C1 INTO ENAME;

          CLOSE C1;

          RETURN (NVL(ENAME,'?'));

          END;


          SELECT H.EMPNO,LOOKUP_EMP(H.EMPNO),

          H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*)

          FROM EMP_HISTORY H

          GROUP BY H.EMPNO , H.HIST_TYPE;


          (譯者按: 經常在論壇中看到如 '能不能用一個SQL寫出….' 的貼子, 殊不知復雜的SQL往往犧牲了執行效率. 能夠掌握上面的運用函數解決問題的方法在實際工作中是非常有意義的)

          posted on 2006-02-25 22:30 Vincent.Chen 閱讀(177) 評論(0)  編輯  收藏 所屬分類: Database

          主站蜘蛛池模板: 阿鲁科尔沁旗| 乳山市| 鹤岗市| 安义县| 沛县| 花莲市| 平泉县| 揭阳市| 民乐县| 宽甸| 南木林县| 怀来县| 怀柔区| 宁蒗| 凤山市| 黎平县| 商洛市| 巴青县| 玛纳斯县| 天长市| 凌源市| 泾川县| 桂平市| 吉安县| 大洼县| 加查县| 东港市| 盐池县| 沂源县| 博湖县| 钟山县| 澳门| 阿鲁科尔沁旗| 金溪县| 百色市| 株洲市| 江孜县| 大新县| 怀化市| 砚山县| 庆阳市|