【问题标题】:SQL: LIKE with OR vs INSQL: LIKE with OR vs IN
【发布时间】:2016-06-04 00:57:34
【问题描述】:

以下之间有性能差异吗?

NAME LIKE '%EXPRESSION_1%' 
OR NAME LIKE '%EXPRESSION_2%'
...
OR NAME LIKE '%EXPRESSION_N%'

VS

NAME IN (ACTUAL_VALUE_1,ACTUAL_VALUE_2,.., ACTUAL_VALUE_N)

【问题讨论】:

  • 这两个条件不是一回事。你无法比较它们。要找出哪个更有效,只需检查执行计划即可。
  • LIKE 命令慢于相等。 IN 的工作看起来与 OR 相同。
  • 你试图比较两个不同的东西......因为 Like '%EXPRESSION_1%' 会给你所有包含 %EXPRESSION_1% 和 IN (EXPRESSION_1) 的东西会给你准确的数据......跨度>

标签: sql oracle11g hql query-performance


【解决方案1】:

IN 版本可能快得多。

这两个版本做同样的事情。但是,如果任一满足您的需求,IN 版本可以利用NAME 上的索引。 LIKE 版本不能,因为该模式以通配符开头。

你可以这样写:

WHERE NAME LIKE 'EXPRESSION_%' 

如果这满足您的需求,它还可以利用NAME 上的索引。

【讨论】:

    【解决方案2】:

    你可以简单地尝试使用

    NAME LIKE '%EXPRESSION_%' 
    

    就性能而言,IN 比 OR 相对要快。您还可以使用两个查询的执行计划来确认性能。

    同样如上所述,您显示的两个查询是不同的。

    第一个查询:

    NAME LIKE '%EXPRESSION_1%' 
    OR NAME LIKE '%EXPRESSION_2%'
    ...
    OR NAME LIKE '%EXPRESSION_N%'
    

    将尝试获取具有示例数据的结果,例如

    EXPRESSION_123
    XXXEXPRESSION_1234
    EXPRESSION_2323
    EXPRESSION_2......
    

    而您的第二个查询将匹配完全匹配的记录

    ACTUAL_VALUE_1,ACTUAL_VALUE_2.....
    

    【讨论】:

    • 我认为有必要提到 LIKE 子句很容易使列上的索引无效,尤其是当它在两边都使用通配符时。因此,执行 LIKE 而不是严格比较时性能损失可能非常高,以至于比较 OR 和 IN 在优化方面毫无意义,在这种情况下
    【解决方案3】:

    如果您使用可以根据给定参数更改的变量表达式。然后使用

    declare @Expression1 varchar(50)
    Set @Expression2 = '%'+ @Expression1 +'%'
    
    
        NAME LIKE @Expression2
    

    所以@Expression1 中的任何参数都会自动处理。

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2012-11-06
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多