在SQL中使用like vs equals之间有什么性能?

时间:2016-03-08 20:06:44

标签: sql sql-server tsql

我使用的是T-SQL(SQL Server)。

这是起始代码:

import some_module
print (some_module.__file__)

这两个陈述之间是否有任何表现:

DECLARE @code as char(8)
SET @code = '123'  -- 123%'
DECLARE @lsUseLikeForCodeWhereCondition char(1)
IF CHARINDEX('%', @code) = 0
    SET @lsUseLikeForCodeWhereCondition = 'N'
ELSE
    SET @lsUseLikeForCodeWhereCondition = 'Y'

VS

 select * from mytable where idn_orn_i LIKE 
  CASE WHEN @lsUseLikeForCodeWhereCondition = 'N' THEN 
    @code
  ELSE
    @code + '%'
  END

两者似乎都返回相同的结果。但它说mytable。它实际上是一个包含10个不同表的连接。所以它不小。大多数情况下,我想知道优化器是否会识别出字符串中没有百分号的情况并且执行等于。

如果重要,则idn_orn_i为char(8)。

3 个答案:

答案 0 :(得分:0)

这两个版本非常不同,这与like=之间的差异几乎没有关系。在第一种模式中,模式是基于表达式的模式,它排除了查询的索引使用。

在第二个中,您有两个查询,每个查询都使用常量。因此,第一个版本肯定会使用适当的索引。我认为第二个也会利用索引(编译器应该将常量表达式转换为常量,以便可以使用索引)。请注意,like要求模式不以通配符开头,并且可能在排序规则上也有一些条件。

答案 1 :(得分:-1)

简短回答,如果可以使用=,请使用=。

如果返回的行数相同,则应该是相同的成本。 实际执行计划应该或多或少相等。话虽这么说,如果你说的是值=' asdf' vs值' asdf%'并且你有更多的行将返回类似vs =,然后=会更快。它也会根据需要扫描/查找的行数而有所不同。这取决于您的数据分布统计信息或基数。

您应该查看执行计划以确定。

答案 2 :(得分:-1)

完全匹配,=,往往执行得更快,因为只检查第一个和/或最后一个字符时,字符串搜索可能会失效。

如果将%放在感兴趣的模式之前,那么如果它不匹配,则不能对第一个字符的匹配进行折扣。它将按顺序搜索字符串,可能是字符串的结尾,直到找到匹配或根本不匹配。因此,更耗时,但对某些任务有用且必要。

类似,没有任何外卡,将以与=相同的方式运行,但=的过程本质上更有效。