zoukankan      html  css  js  c++  java
  • oracle的Date类型遇到MyBatis产生的坑

    坑描述:

      公司的订单表数据量巨大(亿级),在进行查询的时候,发现一个慢查询。

      背景:

        数据库:oracle

        表:T_order 

        索引字段:create_date  (字段类型 date)

      慢查询sql:

        select * from T_order where create_date >= #{parameterDate}

      慢查询的原因:

        如果JAVA中的属性为DATE,而数据库中是DATE类型的话,mybatis会默认将JAVA中DATE属性映射到数据库的Timestamp类型。此时字段 create_date 为date类型,参数parameterDate为timestamp类型,两者的类型不一致。oracle数据库会date类型转换为timestamp类型(精确度小的类型转换为精确度大的类型),因此实际执行的sql语句为:select * from T_order where to_timestamp(create_date ) >= #{parameterDate}   导致左边的列用到函数。即索引列上使用函数后会导致索引失效,这样一来就全表扫描了订单库,造成慢sql。

      解决方法:

        原因以及知道了,解决起来就容易了。

        修改后的sql为:

          select * from T_order where create_date >= cast(#{parameterDate} as date)  

    注意的点:

      1、索引的使用。

      2、MyBatis的类型转换。

      3、oracle的类型转换。

      4、to_timestamp(将date类型转换为Timestamp类型),cast(将某种数据类型的表达式显式转换为另一种数据类型,在此将Timestamp转换为date类型)这两个函数的使用。

  • 相关阅读:
    【转】java的string中,关于split空串总会返回单个元素的数组
    【转】Java实现将文件或者文件夹压缩成zip
    单例模式
    数据库隔离级别
    ckeditor+ckfinder
    extremecomponents
    在linux环境下重启oracle数据库,解决密码过期的问题
    20180918 begin
    hadoop免登录
    CentOS环境下通过YUM安装软件,搭建lnmp环境
  • 原文地址:https://www.cnblogs.com/chen--biao/p/9770554.html
Copyright © 2011-2022 走看看