海鷗航際

          JAVA站
          posts - 11, comments - 53, trackbacks - 1, articles - 102
          關鍵字   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只在刪除全表適用,TRUNCATEDDL不是DML)

           

           

          12.       盡量多使用COMMIT

           

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

           COMMIT所釋放的資源:

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

          b.       被程序語句獲得的鎖

          c.       redo log buffer 中的空間

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

           

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

          主站蜘蛛池模板: 峨眉山市| 专栏| 宜兰市| 镇远县| 彭泽县| 永清县| 宁德市| 偃师市| 玉树县| 嵊泗县| 南陵县| 龙泉市| 凤台县| 泰宁县| 周宁县| 苏尼特右旗| 丰宁| 镇安县| 西华县| 尚志市| 杂多县| 利津县| 泽州县| 云安县| 宁安市| 麻栗坡县| 邵阳县| 肃宁县| 鄢陵县| 古浪县| 庐江县| 女性| 涡阳县| 开平市| 玉门市| 鄯善县| 关岭| 大石桥市| 乐昌市| 嘉祥县| 阳东县|