Запрос медленный, становится быстрым после "dbcc freeproccache".Это могут быть мои параметры? - PullRequest
1 голос
/ 14 января 2011

Сайт обычно работает довольно хорошо, но со временем он становится все медленнее и медленнее.

У нас огромный запрос, чтобы найти продукты, которые ищет пользователь, и они в основном представлены в следующем виде:

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

Таким образом, нам не нужно передавать все параметры, если мы ищем только номер продукта. Может ли это быть причиной того, что запросы становятся медленнее? Что связано с тем, что запрос кэшируется в первый раз, и в следующий раз, когда параметры изменились, он использует старый план запроса?

Если так; Как лучше всего это исправить? Динамический SQL?

1 Ответ

5 голосов
/ 14 января 2011

Из небольшого фрагмента запроса, который вы показали, трудно понять, есть ли у вас проблема с прослушиванием параметров, но похоже, что если вы неожиданно получите лучший план после освобождения кэша

Но это вообще плохой способ написания запросов в любом случае.(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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...