我有一个存储过程,可以对记录进行搜索。
问题是来自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
答案 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语句都只使用聚簇索引扫描。