有问题的网站通常表现相当不错,但随着时间的推移,它变得越来越慢。
我们有一个巨大的查询来查找用户正在搜索的产品,它们大多采用以下形式:
WHERE ProductName LIKE @ProductName OR @ProductName IS NULL
AND ProductGroup LIKE @ProductGroup or @ProductGroup IS NULL
AND (...)
这样,如果我们只搜索产品编号,我们就不必传递所有参数。这可能是查询变慢的原因吗?与第一次缓存查询有关的事情,下次参数更改时,它使用旧的查询计划?
如果是这样;解决这个问题的最佳方法是什么?动态SQL?
答案 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
您可以尝试将这些案例拆分出来或使用动态SQL生成动态搜索条件。