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

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

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

    鷹翔宇空

    學習和生活

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks
    引自:http://www.dbonline.cn/source/oracle/20031218/oracle%20SQL%20performance%20tuning4.html

    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 11:39 TrampEagle 閱讀(423) 評論(0)  編輯  收藏 所屬分類: 技術文摘
    主站蜘蛛池模板: 大学生高清一级毛片免费| 亚洲一区二区三区在线观看精品中文| 亚洲国产第一页www| 日本系列1页亚洲系列| 1024免费福利永久观看网站| 亚洲综合色婷婷七月丁香| 亚洲成a∧人片在线观看无码| 99精品一区二区免费视频| 亚洲日韩VA无码中文字幕| 亚洲中文字幕精品久久| 最近免费中文字幕mv在线电影| 亚洲中文字幕伊人久久无码| 亚洲日本VA中文字幕久久道具| 91香焦国产线观看看免费| 亚洲中文字幕在线第六区| 处破女第一次亚洲18分钟| 最新猫咪www免费人成| 亚洲精品中文字幕乱码影院| 人妻免费一区二区三区最新| 亚洲AV蜜桃永久无码精品| 亚洲精品中文字幕无码A片老| 日韩在线播放全免费| 亚洲欧洲一区二区| 免费国产成人α片| 亚洲精品自产拍在线观看| 青娱乐在线视频免费观看| 免费观看理论片毛片| 亚洲综合久久一本伊伊区| 久久国产免费福利永久| 亚洲一区二区三区首页| 麻豆精品不卡国产免费看| 亚洲日韩av无码| a在线视频免费观看在线视频三区| 国产一区在线观看免费| 亚洲精华国产精华精华液网站| 无码av免费毛片一区二区| 亚洲美女色在线欧洲美女| 亚洲欧洲免费视频| 久久精品国产亚洲AV麻豆~| 永久免费av无码入口国语片| 亚洲乱码中文字幕久久孕妇黑人 |