(转) JAVA,Mybatis,Oracle变量类型与字段类型不一致,分区表全扫的优化

http://blog.itpub.net/28602568/viewspace-2134772/

开发反应[增量库存]功能慢,并反馈查询
有指定分区条件 ,量较小;

1)通过  Oracle DBA常用sql分享  (正在执行的sql) 发现,该SQL的COST>1400000;
2)再通过 select * from table(dbms_xplan.display_cursor( 'SQL_ID','0','advanced'));  分析该sql的执行计划和绑定变量情况发现
  
              PARTITION RANGE ALL 分区全扫;---->createtm分区字段传参数了 为啥会全扫?
                                               |
                              绑定变量中 createtm分区条件显示有传值 
                                               |
  分区条件createtm 部分有【 INTERNAL_FUNCTION 隐含转换函数】;---> 猜测 传参类型和DB字段类型不一致导致分区表全扫;
                                               |
通过 DBA_HIST_SQLBIND查到createtm分区条件传参( 2017/01/17 14:20:00  - 2017/01/17 14:25:00 ),字段类型为timestamp,而createtm字段为date类型;
 
总结:
   开发在java层用的 mybatis框架,把date类型字段转换成timestamp类型【and createtm $gt:=#{params.begintm} and createtm $lt:#{params.endtm}】,出现 INTERNAL_FUNCTION 隐含转换,导致及时分区条件createtm传分区条件也被识别成未传变量,导致分区表全扫;
   优化后 and createtm>= to_date(#{ params.begintm },'yyyy-mm-dd hh24:mi:ss')  and  createtm< to_date(#{ params.endtm },'yyyy-mm-dd hh24:mi:ss')
    
--补充注意Java中的日期变量需要使用String来存储.



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10248702/viewspace-2148618/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10248702/viewspace-2148618/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值