我正在玩两个非常简单的查询。有一个非聚集索引包含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中的参数。
答案 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,则此代码可能会被破坏,但这种情况多久发生一次?