咖啡加糖_ 2021-06-28 18:13 采纳率: 66.7%
浏览 98

mybatis 时间段查询 使用#传入参数很慢的问题

mybatis+sqlserver SQL语句如下:

   

select count(*) from tab_order  order

<if test="orderType != null and orderType != ''"> and order.type = #{orderType } </if>  

<if test="beginTime != null and beginTime != ''"> and order.CREATE_TIME <![CDATA[>= ]]> #{beginTime} </if>

<if test="endTime != null and endTime != ''"> and order.CREATE_TIME <![CDATA[<= ]]> #{endTime} </if>

 

 

省略部分查询条件,其中CREATE_TIME字段类型为datetime2,已经加上聚合索引,type 为 非聚合索引nvarchar,tab_order表中500W数据,此时页面选择时间段查询,后台打印日志为:

Preparing: select count(*) from tab_order order WHERE order.orderType = ? and order.CREATE_TIME >= ? and order.CREATE_TIME <= ?  

 Parameters:   2367 (String),2021-04-01 00:00:00.0(Timestamp), 2021-06-18 23:59:59.999(Timestamp)

查出来的结果是300W左右,耗时30S左右,

于是我怀疑是 因为CREATE_TIME类型是datetime2的,而传入参数是Timestamp的,是不是sqlserver做了啥隐式转换导致不走索引,于是改成

<if test="beginTimeStr != null and beginTimeStr != ''"> and order.CREATE_TIME <![CDATA[>= ]]> convert(datetime2,#{beginTimeStr}) </if>

<if test="endTimeStr != null and endTimeStr != ''"> and order.CREATE_TIME <![CDATA[<= ]]> convert(datetime2,#{endTimeStr}) </if>

把时间段做成字符串然后转成datetime2,可是结果还是一样,还是要30S。

但是如果把sql中的#{beginTime}和#{endTime}改成 $(beginTime)和$(endTime)查询的话,或者固定写成

order.CREATE_TIME >= convert(datetime2,'2021-04-01 00:00:00.0') and order.CREATE_TIME <=  convert(datetime2,'2021-06-17 23:59:59.999') ,都很快基本2S左右结果出来,

还有直接在management studio中执行

select count(*) from tab_order order WHERE order.orderType = '2367 ' and order.CREATE_TIME >= convert(datetime2,'2021-04-01 00:00:00.0') and order.CREATE_TIME <=  convert(datetime2,'2021-06-17 23:59:59.999')

也是秒级就出来,看执行过程也没任何问题

是否有遇到过这个问题朋友,求解了?

  • 写回答

3条回答 默认 最新

  • JolyouLu 2021-06-28 19:17
    关注

    使用between and试一下,<=会导致不走索引

    评论

报告相同问题?

悬赏问题

  • ¥15 Coze智能助手搭建过程中的问题请教
  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?