糟糕的选择:sqlserver vachar字段使用unicode匹配

最近遇到了一个坑,这个坑把数据库搞挂了。。。

最终找到的原因是出现在一个查询语句上,语句很简单,大概如下
Select .. from table a where a.column in (N'test'...) 查询条件in的长度为100.初一看查询计划没有问题,a.column加了索引,所以查询计划包含了这个索引。但仔细一看其实不然,消耗最大的是filter,占到70%以上。

为什么会这样,真相是,a.column这个字段是varchar类型的,索引通过Unicode查询相当于去匹配记录的值,性能非常糟糕。

把语句改成
Select .. from table a where a.column in ('test'...) 后,得到了预想的结果。执行效率上去了,数据库压力立马下来了

在实际开发当中,我们绝对不会写出这种脚本;但是实际上,我们很少自己写脚本,一般使用ORM操作数据库。而我这个脚本是EF Core解析出来的,EF Core可以在mapping的时候使用IsUniclode(false) 指定这个字段不适用Unicode。

如有问题或者更正信息,欢迎访问https://github.com/figodeng/QAndA

你可能感兴趣的:(糟糕的选择:sqlserver vachar字段使用unicode匹配)