星空网 > 软件开发 > 数据库

谨慎使用MyBatis自动生成Where语句

最近监控到类似这样一个慢查询:

select delete_flag,delete_timefrom D_OrderInfo   WHERE ( OrderId is not null and          OrderId = N'xxxx') 

D_OrderInfo表上有一个OrderId的索引,但OrderId字段是Varchar类型。
由于开发框架MyBatis自动生成Where条件不会指定参数类型,字符串类型的参数到了SQLServer里就自动成了NVARCHAR(4000)类型了,
坑人的是,不指定参数类型也就罢了,还自动加了个OrderId Is NOT NULL这样一个非SARG的条件,执行计划成了这样:
谨慎使用MyBatis自动生成Where语句
---------------------------------------------------------------------------------------------
如果没有OrderId IS NOT NULL这个条件,执行计划会是这样的:
谨慎使用MyBatis自动生成Where语句
由于参数类型Nvarchar比索引字段类型varchar优先级要高,不能直接转换,但SQLServer优化器最终还是将他转成了一个范围值,最终的等号查询也变成了类似一个小范围查询。
可以从Index Seek这一步的详细信息可以看出:
谨慎使用MyBatis自动生成Where语句
------------------------------------------------------------------------
如果参数类型匹配,那么执行计划会是想象中的那样(虽然没有包含到,还是有Key Lookup):
谨慎使用MyBatis自动生成Where语句
--------------------------------------------------------------------------------------
当然,有点小小强迫症的我最终希望的写法是这样的:
select delete_flag,delete_timefrom D_OrderInfo   WHERE OrderId = 'xxxx'

执行计划当然也会是这样的:

谨慎使用MyBatis自动生成Where语句

只是,只是不知道最终开发大神能改成什么样......



原标题:谨慎使用MyBatis自动生成Where语句

关键词:mybatis

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

Site Explorer:https://www.goluckyvip.com/tag/25410.html
SiteBuilder:https://www.goluckyvip.com/tag/25411.html
Sitelicon:https://www.goluckyvip.com/tag/25412.html
Siteliner:https://www.goluckyvip.com/tag/25413.html
Sitelinks:https://www.goluckyvip.com/tag/25414.html
SixLeaf:https://www.goluckyvip.com/tag/25415.html
宠物梳专利查询分析:https://www.kjdsnews.com/a/1842293.html
温州旧货市场有玻璃柜卖吗?:https://www.vstour.cn/a/411246.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流