笨拙而詭異的 Oracle(之二)


有一張表,很多數據:
 

想取某個月的數據。初始的想法很簡單,根據日期(RQ)形成條件即可:


 符合條件的記錄數是 129835,但耗時太長:14.515 秒(RQ字段是做過索引的)!直觀的反應是 Oracle 的 TO_CHAR 函數效率不高!那有沒有其他函數呢?有,找到了一個 MONTHS_BETWEEN: 
 

MONTHS_BETWEEN(date1, date2)  是求兩個日期之間的月數,以為就像 SQL Server T-SQL 中的 DATEDIFF(m, date1, date2) 一樣,既然是提取某個月的數據,當然是 MONTHS_BETWEEN(RQ, TO_DATE('20150301', 'YYYYMMDD')) = 0!但結果是不對的,只有 4188 條記錄!仔細研究 MONTHS_BETWEEN,發現與 DATEDIFF(m, date1, date2) 是不一樣的:MONTHS_BETWEEN 對於兩個同月的日期,也是有 月數差的!額滴神吶!膜拜 Oracle!! 把條件改成下面的形式,就對了:


但此時的查詢效率仍然不理想,還需要 8、9 秒的時間!繼續優化,改成下面的形式: 
 

此時的耗時只有 0.031 秒! 至此,優化已經做完了!但條件的寫法能不能再簡化些呢?結果是: 
 

對於 Oracle,還能說什么呢?說什么都是多余的,只有膜拜!!!  
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM