Необходимо решить несколько проблем с производительностью ...
Не обращаться к одной и той же таблице более одного раза, если это возможно
Не использовать подзапрос для критериев, которые могутбыть сделано без необходимости ссылки на дополнительные копии той же таблицы.Это приемлемо, если вам нужны данные из копии таблицы из-за использования агрегатных функций (MAX, MIN и т. Д.), Хотя аналитические функции (ROW_NUMBER, RANK и т. Д.) Могут быть более удобными (при условии поддержки).
Не сравнивайте то, что вам не нужно
Если ваш параметр имеет значение NULL, а это означает, что вы хотите получить любое значение для сравниваемых столбцов, не включайте критерии фильтрации.Такие выражения:
WHERE a.Name LIKE '%' + ISNULL(@Name, N'') + '%'
... гарантируют, что оптимизатору придется сравнивать значения для столбца name
, с подстановочными знаками или нет.Еще хуже в случае с LIKE
является то, что подстановочный знак в левой части оценки гарантирует, что индекс не может использоваться, если он присутствует в столбце, в котором выполняется поиск.
Более эффективный подход будет следующим:
IF @Name IS NOT NULL
BEGIN
SELECT ...
FROM ...
WHERE a.name LIKE '%' + @Name + '%'
END
ELSE
BEGIN
SELECT ...
FROM ...
END
Эффективное выполнение SQL - это все, что нужно для адаптации.Вот почему вы должны учитывать динамический SQL, когда у вас есть запросы с двумя или более независимыми критериями .
Использовать правильный инструмент
Оператор LIKE
неочень эффективен при поиске текста, когда вы проверяете наличие строки в текстовых данных. Технология полнотекстового поиска (FTS) была разработана для устранения недостатков:
IF @Name IS NOT NULL
BEGIN
SELECT ...
FROM ...
WHERE CONTAINS(a.name, @Name)
END
ELSE
BEGIN
SELECT ...
FROM ...
END
Всегда проверяйте и сравнивайте
Я согласен с LittleBobbyTables - решение в конечном итоге основывается на проверкеплан запроса / выполнения для всех альтернатив, потому что дизайн таблицы и данные могут повлиять на решение и производительность оптимизатора.В SQL Server наиболее эффективным является тот, который имеет самую низкую себестоимость, но со временем он может измениться, если статистика таблицы и индексы не будут поддерживаться.