ORACLE SQL性能優化系列 (三-1)

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時必須要注意到事務的完整性,現實中效率和事務完整性往往是魚和熊掌不可得兼)
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章