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

  • 相关阅读:
    python中对一个列表进行乱序
    GPU比CPU慢?可能模型太简单
    VLAN之间单臂路由通信
    数据结构_顺序栈的代码实践
    MarkDown语法学习
    【转载】给想要入门渗透的人的忠告——schiz0wcingU
    SQL注入原理及绕过安全狗
    Python学习---字符串处理
    【转载】RAID写惩罚(Write Penalty)与IOPS计算
    Kali安装使用文泉驿字体
  • 原文地址:https://www.cnblogs.com/chen--biao/p/9770554.html
Copyright © 2011-2022 走看看