【问题标题】:Stop SQL Server Evaluating Useless UPPER/LOWER In WHERE Clause?停止 SQL Server 在 WHERE 子句中评估无用的 UPPER/LOWER?
【发布时间】:2010-07-06 16:13:16
【问题描述】:

似乎尽管 SQL Server 在 WHERE 子句中的大小写不匹配,但它仍然在 WHERE 子句中尊重 UPPER/LOWER,这似乎相当昂贵。是否可以指示 SQL Server 在 WHERE 子句中忽略 UPPER/LOWER?

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

谢谢,杰米

【问题讨论】:

  • SQL Server 可以设置为使用区分大小写的排序规则,但默认情况下它不会。但我很惊讶 UPPER / LOWER 很昂贵,而且这里错过了优化。
  • 将 SQL Server 数据库排序规则设置为不区分大小写。你是什​​么意思它的荣誉?
  • “履行义务”中的“荣誉”。他说它在 SQL 中计算 UPPER('MyString') = 'MYSTRING',即使它随后对结果执行不区分大小写的比较 - 即 WHERE UPPER(column) = @paramWHERE column = @param 在他的数据库中是等效的,但第一个运行速度较慢。
  • @Rup - RE:昂贵 如果您在 WHERE 子句中的列上使用函数,您将获得扫描。例如WHERE LOWER(col1) = 'abc'
  • @Martin Smith - 是的,好点。我本来打算以相反的方式写我的例子WHERE col1 = LOWER('abc'),d'oh。也许这就是杰米的问题?

标签: sql-server


【解决方案1】:

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

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

为了获得最佳性能,您需要维护两个查询,一个针对每个 RDBMS 平台(在您的应用程序中或在存储过程或视图等数据库对象中)。鉴于 Oracle 和 SQL Server 之间在许多其他领域的功能不同,您很可能最终还是会这样做,如果不是为了这个,你还是会这样做。

【讨论】:

    【解决方案2】:

    所以你的意思是这样的:

    WHERE YourColumn = @YourValue collate Latin1_General_BIN
    

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

    请记住,YourColumn 上的索引将使用特定的排序规则,因此如果您在 WHERE 子句(而不是列本身)中指定排序规则,索引的用处将降低。我把这比作几年前我在瑞典飞的时候,我在地图上找不到 Vasteras,因为我认为是 a 的字母实际上带有重音,并且位于字母表的末尾.当我尝试使用错误的排序规则时,地图后面的索引不太好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2010-10-03
      相关资源
      最近更新 更多