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

Esp*_*spo 1 t-sql sql-server parameters performance sql-server-2005

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

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

WHERE ProductName LIKE @ProductName OR @ProductName IS NULL
  AND ProductGroup LIKE @ProductGroup or @ProductGroup IS NULL
  AND (...)
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ith 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
Run Code Online (Sandbox Code Playgroud)

计划

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