码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-02-19 00:16:39      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

技术分享

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

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

标签:

原文地址:http://www.cnblogs.com/ajiangg/p/5199526.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!