海鷗航際

          JAVA站
          posts - 11, comments - 53, trackbacks - 1, articles - 102

          13.       計算記錄條數

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

           

          (譯者按: CSDN論壇中,曾經對此有過相當熱烈的討論, 作者的觀點并不十分準確,通過實際的測試,上述三種方法并沒有顯著的性能差別)

           

          14.       Where子句替換HAVING子句

           

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

           

          例如:

           

               低效:

               SELECT REGIONAVG(LOG_SIZE)

               FROM LOCATION

               GROUP BY REGION

               HAVING REGION REGION != ‘SYDNEY

               AND REGION != ‘PERTH

           

               高效

               SELECT REGIONAVG(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往往犧牲了執行效率. 能夠掌握上面的運用函數解決問題的方法在實際工作中是非常有意義的)

           

           (待續)


          主站蜘蛛池模板: 电白县| 休宁县| 斗六市| 揭西县| 台东县| 论坛| 遂溪县| 岗巴县| 女性| 富裕县| 河南省| 德令哈市| 临夏县| 贵南县| 荔浦县| 天水市| 磴口县| 盐城市| 五寨县| 务川| 江西省| 项城市| 绥德县| 桓仁| 富阳市| 兴海县| 民丰县| 保靖县| 甘孜| 通化县| 拉萨市| 武川县| 涡阳县| 安远县| 罗城| 陈巴尔虎旗| 哈尔滨市| 温州市| 邳州市| 北京市| 西吉县|