Необязательные параметры и индекс даты - PullRequest
2 голосов
/ 12 мая 2011

Я играю с двумя очень простыми запросами. Существует некластеризованный индекс с StartDate и EndDate, а также Id в качестве включенного столбца.

DECLARE @startDate DATETIME, @endDate DATETIME
SELECT @startDate = '4/1/2011', @endDate = '5/1/2011'

-- Does Index Scan (slow)
SELECT Id
FROM dbo.Table
WHERE
    (@startDate IS NULL OR StartDate >= @startDate) AND
    (@endDate IS NULL OR EndDate < @endDate)

-- Does Index Seek (fast)
SELECT Id
FROM dbo.Table
WHERE
    (StartDate >= @startDate) AND
    (EndDate < @endDate)

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

Редактировать: Я знаю, что это очень простая проблема индексации, но я еще не нашел хорошего решения. Обратите внимание, что я объявляю переменные, но это будут параметры в sproc.

1 Ответ

2 голосов
/ 12 мая 2011

А как насчет следующего?

DECLARE @startDate DATETIME, @endDate DATETIME
SELECT @startDate = '4/1/2011', @endDate = '5/1/2011'

SELECT Id
FROM dbo.Table
WHERE
    StartDate >= ISNULL(@startDate, '1/1/1753') 
    AND
    EndDate < ISNULL(@endDate, '12/31/9999')

Этот код, вероятно, не работает, если в вашей таблице указана дата окончания 31.12.9999, которую вы на самом деле хотите вернуть из набора результатов, но как часто это происходит?

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