Vincent.Chan‘s Blog

          常用鏈接

          統(tǒng)計

          積分與排名

          網(wǎng)站

          最新評論

          ORACLE SQL性能優(yōu)化系列 (四)

          ORACLE SQL性能優(yōu)化系列 (四)

          作者: black_snail

           

          關(guān)鍵字 ORACLE SQL PERFORMANCE TUNING

          出處 http://WWW.DBASUPPORT.COM



          13. 計算記錄條數(shù)

          和一般的觀點(diǎn)相反, count(*) 比count(1)稍快 , 當(dāng)然如果可以通過索引檢索,對索引列的計數(shù)仍舊是最快的. 例如 COUNT(EMPNO)


          (譯者按: 在CSDN論壇中,曾經(jīng)對此有過相當(dāng)熱烈的討論, 作者的觀點(diǎn)并不十分準(zhǔn)確,通過實(shí)際的測試,上述三種方法并沒有顯著的性能差別)


          14. 用Where子句替換HAVING子句


          避免使用HAVING子句, HAVING 只會在檢索出所有記錄之后才對結(jié)果集進(jìn)行過濾. 這個處理需要排序,總計等操作. 如果能通過WHERE子句限制記錄的數(shù)目,那就能減少這方面的開銷.


          例如:


          低效:

          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 中的條件一般用于對一些集合函數(shù)的比較,如COUNT() 等等. 除此而外,一般的條件應(yīng)該寫在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. 通過內(nèi)部函數(shù)提高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;


          通過調(diào)用下面的函數(shù)可以提高效率.

          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;


          (譯者按: 經(jīng)常在論壇中看到如 '能不能用一個SQL寫出….' 的貼子, 殊不知復(fù)雜的SQL往往犧牲了執(zhí)行效率. 能夠掌握上面的運(yùn)用函數(shù)解決問題的方法在實(shí)際工作中是非常有意義的)

          posted on 2006-02-25 22:30 Vincent.Chen 閱讀(177) 評論(0)  編輯  收藏 所屬分類: Database

          主站蜘蛛池模板: 绥中县| 东港市| 栖霞市| 镇原县| 泰州市| 郑州市| 玉门市| 江油市| 浦城县| 阿坝县| 武功县| 湘阴县| 四子王旗| 高尔夫| 西贡区| 栾城县| 嫩江县| 木里| 罗江县| 永登县| 南溪县| 绥滨县| 漳平市| 玉溪市| 荣昌县| 遂平县| 抚松县| 和静县| 武陟县| 内丘县| 锡林浩特市| 大悟县| 聂拉木县| 和顺县| 安化县| 深圳市| 中江县| 荔波县| 汝城县| 宜章县| 丹阳市|