<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(176) 評論(0)  編輯  收藏 所屬分類: Database

    主站蜘蛛池模板: 成年女人免费视频播放体验区 | 亚洲天堂中文资源| www在线观看播放免费视频日本| 成在线人永久免费视频播放| 国产亚洲玖玖玖在线观看| 日韩精品福利片午夜免费观着| 亚洲五月综合缴情婷婷| 久久这里只有精品国产免费10| 亚洲a级片在线观看| 成年女人毛片免费视频| 亚洲av无码无线在线观看| 国产美女精品久久久久久久免费 | 亚洲人成在线中文字幕| 国产1000部成人免费视频| 亚洲www在线观看| 永久中文字幕免费视频网站| 国产亚洲人成在线播放| 亚洲女人被黑人巨大进入| 999zyz**站免费毛片| 91在线亚洲精品专区| 成人毛片免费在线观看| 久久久亚洲精华液精华液精华液| 免费国产人做人视频在线观看| xxxxx做受大片视频免费| 亚洲ⅴ国产v天堂a无码二区| 久久精品免费一区二区| 亚洲国产成人久久精品大牛影视| 亚洲AV永久无码精品一区二区国产 | 国产午夜亚洲不卡| 最近免费中文在线视频| 456亚洲人成影院在线观| 亚洲国产精品第一区二区三区| 免费毛片在线看不用播放器| 亚洲熟妇av一区二区三区下载| 在线免费观看一区二区三区| 一级毛片免费播放视频| 亚洲欧洲日产v特级毛片| 国产禁女女网站免费看| 在线涩涩免费观看国产精品| 2020国产精品亚洲综合网| 亚洲色偷偷综合亚洲AV伊人|