隐式转换会导致查询不走索引而走全盘扫描。
线上某家公司定时任务更新数据的时候报错,错误信息如下1[Err] 22018 - [SQL Server]Conversion failed when converting the varchar value '2,3' to data type int.
第一反应是更新数据时,将某个numeric字段更新成字符串‘2,3’,这就导致转换出错。然后花了点时间搜寻日志,结果惊奇发现要更新的数据里没有数据是‘2,3’。懵逼了一阵后,申请查询线上数据,结果发现一个简单的查询都会报错。这样就确定了其实是历史数据是有‘2,3’的,而不是要更新的数据里有造成的。
以下做个简单测试,表student有varchar字段age,其中有条数据age为44c。
然后手写一个简单查询,因为age=11这种写法存在隐式转换,导致全盘扫描,所有数据库数据取出来都转换成int然后和11比较是否相等,其中字符串‘44c’无法转换成int而报错。至此线上问题已经复现。
下面是一个没有隐式转换,正确的查询。
下面虽然是有隐式转换但是也不报错的查询,因为查询加了新的查询条件导致查询结果集为空,也就不需要转换了。