sql語句的簡化

jeanron100發表於2014-06-18
今天碰到一個sql語句簡化的問題,雖然也不復雜,但是也值得從中學習一些東西

SELECT MOD(((SELECT TO_NUMBER(TO_CHAR(LOGICAL_DATE, 'YYYY'))
               FROM SMALL_TAB
              WHERE LOGICAL_DATE_TYPE = 'R'
                AND EXPIRATION_DATE IS NULL) * 365 +
           (SELECT TO_NUMBER((SELECT LOGICAL_DATE
                                 FROM SMALL_TAB
                                WHERE LOGICAL_DATE_TYPE = 'R'
                                  AND EXPIRATION_DATE IS NULL) -
                              TRUNC(SYSDATE, 'YYYY'))
               FROM DUAL)) + 1,
           (SELECT NVL(PARAMETER_VALUE+1,366)FROM SMALL_TAB2
                                 WHERE PARAMETER_NAME = 'DAY_PAR')                     
  FROM DUAL

我得到了這樣一個sql語句,但是猛一看sql語句裡面包含了不少dual。
這樣的sql語句是比較臃腫的,感覺需要做一些工作來改動,首先就是需要明確需求,開發想實現什麼樣的功能,然後在保證結果集準確的前提下來進行簡化工作。
大體上溝通以後,sql語句的實現功能類似下面的形式
  SELECT MOD((2014 * 365 + (165)) + 1,
             366)
    FROM DUAL
其實就是計算當前的年份,然後得到對應的天數和當年一月一日以來的天數。 在此基礎上做計算得到一個對應的key
簡單調整後,就成了下面的樣子,把多餘的dual全都去掉了。在測試中比較發現,對應的邏輯讀一下子從128降低到了64,相應時間也有了一定的提升。
select mod(
            (SELECT TO_NUMBER(TO_CHAR(LOGICAL_DATE, 'YYYY')) * 365 +
                  TO_NUMBER(LOGICAL_DATE - TRUNC(SYSDATE, 'YYYY')) + 1
             FROM SMALL_TAB
            WHERE LOGICAL_DATE_TYPE = 'R'
              AND EXPIRATION_DATE IS NULL),
           (SELECT NVL(PARAMETER_VALUE + 1, 366)
              FROM SMALL_TAB2
             WHERE PARAMETER_NAME = 'DAY_PAR')
           )
  from dual;

其實效能的提升不夠明顯,但是簡單清晰的sql語句,在日常的維護中也能省不少心。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1188534/,如需轉載,請註明出處,否則將追究法律責任。

相關文章