Да, они будут использоваться (возможно, проверьте план выполнения, но я знаю, что необязательность ваших параметров не должна иметь никакого значения)
Если у вас проблемы с производительностьюзапрос, то это может быть результатом перехвата параметров.Попробуйте следующий вариант вашей хранимой процедуры и посмотрите, имеет ли это какое-либо значение:
CREATE PROCEDURE dbo.GetActiveEmployee
@startTime DATETIME=NULL,
@endTime DATETIME=NULL
AS
SET NOCOUNT ON
DECLARE @startTimeCopy DATETIME
DECLARE @endTimeCopy DATETIME
set @startTimeCopy = @startTime
set @endTimeCopy = @endTime
SELECT columns
FROM table
WHERE (@startTimeCopy is NULL or table.StartTime >= @startTimeCopy) AND
(@endTimeCopy is NULL or table.EndTime <= @endTimeCopy)
Это отключает анализ параметров (SQL-сервер использует фактические значения, переданные SP для оптимизации) - В прошлом я 'исправив некоторые странные проблемы с производительностью, я все еще не могу удовлетворительно объяснить, почему, однако.
Еще одна вещь, которую вы, возможно, захотите попробовать, - это разделить ваш запрос на несколько различных операторов в зависимости от NULL-ности ваших параметров.:
IF @startTime is NULL
BEGIN
IF @endTime IS NULL
SELECT columns FROM table
ELSE
SELECT columns FROM table WHERE table.EndTime <= @endTime
END
ELSE
IF @endTime IS NULL
SELECT columns FROM table WHERE table.StartTime >= @startTime
ELSE
SELECT columns FROM table WHERE table.StartTime >= @startTime AND table.EndTime <= @endTime
BEGIN
Это грязно, но, возможно, стоит попробовать, если у вас возникли проблемы, потому что это помогает, потому что сервер SQL может иметь только один план выполнения на оператор SQL, однако ваш оператор потенциально можетвозвращает очень разные наборы результатов.
Например, если вы передадите NULL и NULL, вы вернете всю таблицу и наиболее оптимальный план выполнения, однако если вы передадите небольшой диапазон дат, более вероятно, чтопоиск строки будет наиболее оптимальным планом выполнения.
С этим запросом в качестве одного оператора SQL-сервер вынужден выбирать между этими двумя параметрами, и поэтому план запроса, вероятно, будет неоптимальным в определенных ситуациях.Однако, разделив запрос на несколько операторов, SQL-сервер может иметь разные планы выполнения в каждом случае.
(Вы также можете использовать функцию / 1012 * динамический SQL для достижения того же результата, если хотите)