ORACLE SQL效能最佳化(四)

來源:互聯網
上載者:User

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往往犧牲了執行效率. 能夠掌握上面的運用函數解決問題的方法在實際工作


中是非常有意義的)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.