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

  • 相关阅读:
    MVC 导出CSV
    用Nero 10.0 刻录系统安装盘步骤
    还原Ghost系统步骤简单描述
    在XP系统中发布MVC3项目nopCommerce2.65及配置
    Win2003合并磁盘分区
    GridView常用操作及注意点
    SPGroup 和SPUser的常用操作
    【转】密封类
    Sharepoint 常用的Cmd 命令
    SharePoint 上传文件到图片库中代码
  • 原文地址:https://www.cnblogs.com/chen--biao/p/9770554.html
Copyright © 2011-2022 走看看