查询很慢,在“dbcc freeproccache”之后变得很快。这可能是我的参数吗?

时间:2011-01-14 12:48:04

标签: sql-server performance sql-server-2005 tsql parameters

有问题的网站通常表现相当不错,但随着时间的推移,它变得越来越慢。

我们有一个巨大的查询来查找用户正在搜索的产品,它们大多采用以下形式:

WHERE ProductName LIKE @ProductName OR @ProductName IS NULL
  AND ProductGroup LIKE @ProductGroup or @ProductGroup IS NULL
  AND (...)

这样,如果我们只搜索产品编号,我们就不必传递所有参数。这可能是查询变慢的原因吗?与第一次缓存查询有关的事情,下次参数更改时,它使用旧的查询计划?

如果是这样;解决这个问题的最佳方法是什么?动态SQL?

1 个答案:

答案 0 :(得分:5)

从您显示的查询的小片段中很难看出您是否可能有参数嗅探问题,但如果您在释放缓存后突然获得更好的计划,则听起来就好了

但这通常是编写查询的一种不好的方式。 (WHERE x=@x OR @X IS NULL类型的查询)因为它导致不必要的扫描。根据您的LIKE是否具有前导通配符,在这种情况下可能没有任何区别。

但是SQL Server无论如何都可以将LIKE转换为索引上的范围搜索,因此如果没有前导通配符,您将不必要地惩罚查询。 (例如,比较下面查询的计划)

DECLARE @T nchar(3) 
SET @T='%f'


SELECT [name]
  FROM [master].[dbo].[spt_values]
where type like @T


SELECT [name]
  FROM [master].[dbo].[spt_values]
where type like @T OR @T IS NULL

Plan

您可以尝试将这些案例拆分出来或使用动态SQL生成动态搜索条件。