可选参数和日期索引

时间:2011-05-12 17:59:37

标签: tsql indexing

我正在玩两个非常简单的查询。有一个非聚集索引包含StartDateEndDate,以及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 个答案:

答案 0 :(得分:2)

以下情况如何?

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')

如果您的表格中有一个实际希望从结果集中返回的结束日期为12/31/9999,则此代码可能会被破坏,但这种情况多久发生一次?