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

    主站蜘蛛池模板: 视频免费在线观看| 亚洲精品成人片在线播放| 毛片基地看看成人免费| 亚洲粉嫩美白在线| 亚洲欧洲国产日韩精品| 国产亚洲精品不卡在线| 日本牲交大片免费观看| 中文字幕无码视频手机免费看| 久久久精品午夜免费不卡| 天堂亚洲免费视频| 亚洲av永久无码精品网址| 亚洲jjzzjjzz在线播放| 亚洲日本精品一区二区| 亚洲永久无码3D动漫一区| 亚洲精品视频在线看| 免费亚洲视频在线观看| 成年女人毛片免费播放人| 国产精品视频免费| 99热在线免费播放| 久久99精品免费视频| 在线观看免费无码视频| jizz在线免费观看| 九九久久国产精品免费热6| 四虎成人精品国产永久免费无码| 亚洲gay片在线gv网站| 亚洲а∨精品天堂在线| 亚洲一卡2卡3卡4卡5卡6卡| 最新国产成人亚洲精品影院| 亚洲一区电影在线观看| 亚洲av永久无码精品天堂久久| 亚洲成a人片在线观看中文!!!| 久久精品国产亚洲AV无码娇色 | 亚洲国产精品免费在线观看| 久久亚洲精品中文字幕| 亚洲伊人久久大香线蕉苏妲己| 亚洲AV无一区二区三区久久| 亚洲AV日韩AV高潮无码专区| 久久亚洲精品成人av无码网站| 亚洲视频小说图片| 亚洲mv国产精品mv日本mv| 亚洲精品中文字幕|