where (@IDCriteria is null or ID=@IDCriteria)
and (@MaxDateCriteria is null or Date<@MaxDateCriteria)
Если вы напишите этот критерий, то SQL-сервер не будет знать, лучше ли использовать индекс для идентификаторов или индекс для дат.
Для правильной оптимизации гораздо лучше написать отдельные запросы для каждого случая и использовать IF, чтобы привести вас к правильному.
IF @IDCriteria is not null and @MaxDateCriteria is not null
--query
WHERE ID = @IDCriteria and Date < @MaxDateCriteria
ELSE IF @IDCriteria is not null
--query
WHERE ID = @IDCriteria
ELSE IF @MaxDateCriteria is not null
--query
WHERE Date < @MaxDateCriteria
ELSE
--query
WHERE 1 = 1
Если вы ожидаете, что из оптимизатора понадобятся другие планы, вам нужно написать разные запросы, чтобы получить их !!
Будет ли генерация кода SQL, содержащего только необходимые выражения where, значительно быстрее?
Да - если вы ожидаете, что оптимизатор будет выбирать между разными планами.
Edit:
DECLARE @CustomerNumber int, @CustomerName varchar(30)
SET @CustomerNumber = 123
SET @CustomerName = '123'
SELECT * FROM Customers
WHERE (CustomerNumber = @CustomerNumber OR @CustomerNumber is null)
AND (CustomerName = @CustomerName OR @CustomerName is null)
CustomerName и CustomerNumber индексируются. Оптимизатор говорит: «Кластерный
Сканирование индекса с распараллеливанием ". Вы не можете написать худший запрос к одной таблице.
Редактировать: у меня есть около 20 возможных параметров, и каждая комбинация из n ненулевых параметров может иметь место.
У нас была похожая функция поиска в нашей базе данных. Когда мы посмотрели на фактические запросы, 99,9% из них использовали AccountIdentifier. В вашем случае я подозреваю, что либо один столбец - всегда предоставлен - либо один из двух столбцов всегда указан. Это приведет к 2 или 3 случаям соответственно.
Не важно удалять ИЛИ из всей структуры. Важно удалить OR из столбцов / столбцов, которые, как вы ожидаете, будет использовать оптимизатор для доступа к индексам.