<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%20tuning3.html

    ORACLE SQL性能優化系列 (三)

    作者: black_snail

     

    關鍵字 ORACLE SQL PERFORMANCE TUNING

    出處 http://www.dbasupport.com



    8. 使用DECODE函數來減少處理時間


    使用DECODE函數可以避免重復掃描相同記錄或重復連接相同的表.


    例如:

    SELECT COUNT(*),SUM(SAL)

    FROM EMP

    WHERE DEPT_NO = 0020

    AND ENAME LIKE ‘SMITH%';


    SELECT COUNT(*),SUM(SAL)

    FROM EMP

    WHERE DEPT_NO = 0030

    AND ENAME LIKE ‘SMITH%';


    你可以用DECODE函數高效地得到相同結果


    SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT,

    COUNT(DECODE(DEPT_NO,0030,'X',NULL)) D0030_COUNT,

    SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,

    SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL

    FROM EMP WHERE ENAME LIKE ‘SMITH%';


    類似的,DECODE函數也可以運用于GROUP BY 和ORDER BY子句中.



    9. 整合簡單,無關聯的數據庫訪問


    如果你有幾個簡單的數據庫查詢語句,你可以把它們整合到一個查詢中(即使它們之間沒有關系)

    例如:


    SELECT NAME

    FROM EMP

    WHERE EMP_NO = 1234;


    SELECT NAME

    FROM DPT

    WHERE DPT_NO = 10 ;


    SELECT NAME

    FROM CAT

    WHERE CAT_TYPE = ‘RD';


    上面的3個查詢可以被合并成一個:


    SELECT E.NAME , D.NAME , C.NAME

    FROM CAT C , DPT D , EMP E,DUAL X

    WHERE NVL(‘X',X.DUMMY) = NVL(‘X',E.ROWID(+))

    AND NVL(‘X',X.DUMMY) = NVL(‘X',D.ROWID(+))

    AND NVL(‘X',X.DUMMY) = NVL(‘X',C.ROWID(+))

    AND E.EMP_NO(+) = 1234

    AND D.DEPT_NO(+) = 10

    AND C.CAT_TYPE(+) = ‘RD';


    (譯者按: 雖然采取這種方法,效率得到提高,但是程序的可讀性大大降低,所以讀者 還是要權衡之間的利弊)


    10. 刪除重復記錄

    最高效的刪除重復記錄方法 ( 因為使用了ROWID)


    DELETE FROM EMP E

    WHERE E.ROWID > (SELECT MIN(X.ROWID)

    FROM EMP X

    WHERE X.EMP_NO = E.EMP_NO);


    11. 用TRUNCATE替代DELETE

    當刪除表中的記錄時,在通常情況下, 回滾段(rollback segments ) 用來存放可以被恢復的信息. 如果你沒有COMMIT事務,ORACLE會將數據恢復到刪除之前的狀態(準確地說是

    恢復到執行刪除命令之前的狀況)


    而當運用TRUNCATE時, 回滾段不再存放任何可被恢復的信息.當命令運行后,數據不能被恢復.因此很少的資源被調用,執行時間也會很短.


    (譯者按: TRUNCATE只在刪除全表適用,TRUNCATE是DDL不是DML)



    12. 盡量多使用COMMIT


    只要有可能,在程序中盡量多使用COMMIT, 這樣程序的性能得到提高,需求也會因為COMMIT所釋放的資源而減少:

    COMMIT所釋放的資源:

    a. 回滾段上用于恢復數據的信息.

    b. 被程序語句獲得的鎖

    c. redo log buffer 中的空間

    d. ORACLE為管理上述3種資源中的內部花費


    (譯者按: 在使用COMMIT時必須要注意到事務的完整性,現實中效率和事務完整性往往是魚和熊掌不可得兼)



    對該文的評論 人氣:4369
    black_snail (2003-9-7 19:16:56)

    如果DECODE取值為NULL,SUM(NULL)的值是NULL -->如果所有的值都是NULL , SUM(NULL) = NULL 但是只要有一個值不是NULL,SUM() <> NULL 所以原SQL應該沒有什么邏輯上的問題

    menlion (2003-9-4 12:38:01)

    關于第八點的個人看法:如果DECODE取值為NULL,SUM(NULL)的值是NULL,不會正常求和的。可以改成如下所示就好了: SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT, COUNT(DECODE(DEPT_NO,0030,'X',NULL)) D0030_COUNT, SUM(DECODE(DEPT_NO,0020,SAL,0)) D0020_SAL, SUM(DECODE(DEPT_NO,0030,SAL,0)) D0030_SAL FROM EMP WHERE ENAME LIKE ‘SMITH%';


                                                                       《上一頁》  |  《下一頁》
    posted on 2006-02-25 11:37 TrampEagle 閱讀(386) 評論(0)  編輯  收藏 所屬分類: 技術文摘
    主站蜘蛛池模板: 亚洲男同gay片| 免费成人在线电影| 国产亚洲av片在线观看播放| 久久青青草原国产精品免费| 亚洲最大的黄色网| 亚洲va中文字幕无码| 久别的草原电视剧免费观看| 亚洲综合无码一区二区痴汉| 亚洲精品国产精品国自产观看| 鲁大师在线影院免费观看| 精品久久久久久亚洲综合网| 亚洲成av人在线视| 国产成人精品免费直播| 久久久久久国产精品免费免费男同| 亚洲一区二区三区国产精华液| 国产亚洲av片在线观看16女人| 成人au免费视频影院| 久久aa毛片免费播放嗯啊| 国产AV日韩A∨亚洲AV电影| 777亚洲精品乱码久久久久久| 午夜亚洲国产成人不卡在线| 噼里啪啦免费观看高清动漫4| 最近国语视频在线观看免费播放| 亚洲综合精品成人| 亚洲国产国产综合一区首页| 免费吃奶摸下激烈视频| 国产大片91精品免费观看不卡| 一级毛片在线免费视频| 亚洲欧洲AV无码专区| 亚洲欧洲日韩国产综合在线二区| 亚洲A∨精品一区二区三区| 免费做爰猛烈吃奶摸视频在线观看 | 久久久亚洲精品国产| 国产成人在线观看免费网站| 131美女爱做免费毛片| a国产成人免费视频| 一级一看免费完整版毛片| 亚洲日本在线电影| 国产成人精品日本亚洲专区6| 久久久综合亚洲色一区二区三区| 亚洲人成人网站在线观看|