Оптимизация функций SQL Server (занимает слишком много времени) - PullRequest
0 голосов
/ 22 февраля 2019

Я разработал функцию, которая работает с отчетом SSRS.У меня есть выпадающий параметр, который перечисляет несколько элементов, и только один может быть выбран.Этот выпадающий список получает свои данные из набора запросов / данных, и я добавил в него одну строку данных с надписью «Все».Таким образом, раскрывающийся список будет выглядеть следующим образом:

  1. Item1
  2. Item2
  3. Item3
  4. Все

И затемв этой функции я вносил одно небольшое изменение в предложение where:

...where (@parameterName = 'All' or table.name = @parameterName)

Проблема в том, что table.name имеет около 50000 строк данных.Когда пользователь выбирает «Все» в раскрывающемся списке, я бы подумал, что, поскольку первый оператор в скобках является истинным, и что следующий оператор (после «или») даже не должен выполняться.Но это заставляет запрос выполняться в течение 5-20 минут и все равно не дает никакого результата после этого времени.Если я просто изменю предложение where на

...where (@parameterName = 'All')

Функция выполняется менее чем за секунду, если пользователь все еще выбирает «Все» из выпадающего списка.

Я реализую аналогичную концепциюс другим фильтром, но я думаю, потому что таблица, которую использует этот параметр, намного меньше (около 90 строк), поэтому это не займет много времени.

Есть ли в принципе способ иметь необязательный параметр, который не дорогойдля расчета?

РЕДАКТИРОВАТЬ: Я добавлю, что параметр объявлен как nvarchar(max).Поможет ли это изменить запрос на что-то меньшее?

1 Ответ

0 голосов
/ 22 февраля 2019

То, что у вас есть, это универсальный запрос.Попробуйте добавить OPTION (RECOMPILE) в конец вашего утверждения.Это заставит движок пересоздавать план каждый раз при запуске запроса, а это означает, что он не будет использовать неправильные варианты, основанные на предыдущем запуске, где ваша переменная имеет значение типа 'Item1'.

...