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类型)这两个函数的使用。

  • 相关阅读:
    spring boot 定时任务
    logger日志级别
    jstl与el结合常见用法
    sql 案例
    Python 环境
    java rsa加密解密
    app扫描二维码登陆
    TimerTask定时任务
    spring3+quartz2
    表关系
  • 原文地址:https://www.cnblogs.com/chen--biao/p/9770554.html
Copyright © 2011-2022 走看看