停止SQL Server在WHERE子句中评估无用的UPPER / LOWER?

时间:2010-07-06 16:13:16

标签: sql-server

似乎尽管SQL Server在WHERE子句中的情况不匹配,但它仍然在WHERE子句中尊重UPPER / LOWER,这看起来非常昂贵。是否可以指示SQL Server忽略WHERE子句中的UPPER / LOWER?

这似乎是一个毫无意义的问题,但能够为Oracle和SQL Server编写单个查询非常好。

谢谢,杰米

2 个答案:

答案 0 :(得分:4)

对你的问题的简短回答是否定的 - 你不能让SQL服务器神奇地忽略WHERE子句中的函数调用。

正如其他人所说,导致性能问题的原因是,在SQL Server上,使用WHERE子句中的函数会阻止使用索引并强制进行表扫描。

为了获得最佳性能,您需要维护两个查询,每个查询对应一个RDBMS平台(在您的应用程序中或在数据库对象中,如存储过程或视图)。鉴于Oracle和SQL Server之间的许多其他功能区域不同,无论如何,您可能会最终执行此操作,如果不是这样的话,还可以使用其他功能。

答案 1 :(得分:0)

所以你的意思是:

WHERE YourColumn = @YourValue collate Latin1_General_BIN

但是如果你想让它在没有collat​​e关键字的情况下工作,你可以将列的排序规则设置为不区分大小写的东西。

请记住,YourColumn上的索引将使用特定的排序规则,因此如果在WHERE子句中指定排序规则(而不是在列本身上),则索引的用处不大。我把它比作这样一个事实:几年前我在瑞典飞行时,我在地图上找不到韦斯特罗斯,因为我认为a的字母实际上有重音,并且位于最后字母表。当我试图使用错误的排序规则时,地图背面的索引不太好。