加快效率过低的过滤器

时间:2014-12-01 11:43:40

标签: sql sql-server sql-server-2012

我有一个参数化存储过程。其中一个参数是@aName,允许为NULL且通常为空。

存储过程中的查询包含以下过滤器:

AND Name LIKE ('%' + ISNULL(@aName,Name) + '%')

这个过滤器有效但由于以下原因而使我效率低下:

如果@aName为空,那么我们只想Name = Name,但我们得到Name LIKE ('%Name%')

如何使滤波器短路,以便获得以下信息:

  1. 如果@aName为null,则使用Name = Name1=1
  2. 如果@aName不为null,则使用Name LIKE ('%Name%')

2 个答案:

答案 0 :(得分:4)

您正在考虑的问题是:

AND (@aName IS NULL OR Name LIKE ('%' + @aName + '%') )

我认为不会有明显的速度差异。

你也可以打开"打开"整个查询:

IF (@aName IS NULL)
BEGIN
    SELECT . . .
    FROM . . .
    WHERE . . .
END;
ELSE
    SELECT . . .
    FROM
    WHERE . . . AND
          LIKE ('%' + @aName + '%') 
END;

这将为第一个版本带来优化优势。

答案 1 :(得分:3)

仅在@aName不是@aName时检查名称是否与null一样。

AND (@aName is null or Name LIKE '%' + @aName + '%')