笨拙而诡异的 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