SQL Server是否优化了LIKE('%%')查询?

时间:2011-02-18 09:42:12

标签: sql sql-server search stored-procedures sql-like

我有一个存储过程,可以对记录进行搜索。

问题是来自UI的一些搜索条件可能是空字符串。 因此,当未指定条件时,LIKE语句变得多余。

如何有效地执行该搜索或Sql Server?或者,它是否优化LIKE('%%')查询,因为它意味着没有可比较的内容?

存储过程是这样的:

ALTER PROC [FRA].[MCC_SEARCH]
@MCC_Code varchar(4),
@MCC_Desc nvarchar(50),
@Detail nvarchar(50)
AS
BEGIN             
       SELECT
             MCC_Code,
             MCC_Desc,
             CreateDate,
             CreatingUser

       FROM
              FRA.MCC (NOLOCK)
       WHERE
             MCC_Code LIKE ('%' + @MCC_Code + '%')
             AND MCC_Desc LIKE ('%' + @MCC_Desc + '%')
             AND Detail LIKE ('%' + @Detail + '%')
       ORDER BY MCC_Code

END

3 个答案:

答案 0 :(得分:5)

关于使用索引的最佳执行计划 - 没有。前缀通配符可防止使用索引,从而导致扫描。

如果您在搜索字词末尾没有通配符,那么该方案可以进行优化 - 我在一段时间内发布了博客:Optimising wildcard prefixed LIKE conditions

<强>更新
澄清我的观点:
像'Something%' - 能够使用索引
LIKE'%Something' - 无法使用开箱即用的索引。但是你可以通过遵循我链接到的“REVERSE技术”来优化它以允许它使用索引 LIKE'%Something%' - 无法使用索引。你无法优化LIKE。

答案 1 :(得分:4)

简短的回答是 - 答案很长 - 绝对不是

  

它是否优化LIKE('%%')查询,因为它意味着没有可比较的内容?

该声明不真实,因为要比较的内容。以下是等效的

WHERE column LIKE '%%'
WHERE column IS NOT NULL

IS NOT NULL需要进行表扫描,除非列中的非空值非常少且索引很好。

修改

SQL Server中动态搜索过程的资源:
您只需必须阅读本文作者:Erland Sommarskog,SQL Server MVP http://www.sommarskog.se/dyn-search.html(选择您的版本或阅读两者)

否则,如果您在CONTAINS样式搜索中需要良好的性能,请考虑使用SQL Server全文引擎。

答案 2 :(得分:3)

如果您使用LIKE clausule,并指定通配符(%)作为searchstring的前缀,SQL Server(以及我猜的所有其他DBMS)将无法使用可能存在的索引列。

如果您使用空的搜索参数,我不知道它是否优化了查询...如果您查看执行计划,也许您的问题可能会得到解答?

编辑:我刚刚检查了这个,以及本声明的执行计划:

select * from mytable

与此声明的exec计划完全相同:

select * from mytable where description like '%'

两个SQL语句都只使用聚簇索引扫描。