<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



    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 22:29 Vincent.Chen 閱讀(172) 評論(0)  編輯  收藏 所屬分類: Database

    主站蜘蛛池模板: 中国一级毛片免费看视频| 久久久亚洲精华液精华液精华液| 美女被免费网站在线视频免费| 在线看片免费不卡人成视频| 亚洲国产日韩在线人成下载 | 亚洲欧洲尹人香蕉综合| 久久精品成人免费看| 亚洲av中文无码乱人伦在线播放 | 亚洲成片观看四虎永久| 老湿机一区午夜精品免费福利| 免费一级毛片不卡不收费| 一级特黄录像免费播放中文版| 亚洲AV无码乱码精品国产| h视频免费高清在线观看| 亚洲精品无码AV人在线播放| 久久er国产精品免费观看2| 亚洲精品中文字幕乱码影院| 免费无码AV片在线观看软件| 国产亚洲欧美日韩亚洲中文色| 亚洲人成无码网站久久99热国产| 中文字幕av免费专区| 日韩亚洲Av人人夜夜澡人人爽 | 亚洲无码在线播放| 一区二区三区四区免费视频 | 亚洲va在线va天堂va四虎| 19禁啪啪无遮挡免费网站| 久久乐国产综合亚洲精品| 免费二级毛片免费完整视频| 国产99久久久国产精免费| 久久亚洲精品人成综合网| 成年女人毛片免费播放视频m| 特a级免费高清黄色片 | 亚洲中文字幕无码一久久区| 2022久久国产精品免费热麻豆| 亚洲高清国产拍精品熟女| 亚洲深深色噜噜狠狠爱网站| 日韩在线免费视频| 成人一级免费视频| 亚洲另类小说图片| 亚洲午夜福利精品久久| 99久久99这里只有免费费精品 |