2015-11-16 85 views
1

我有一个由许多列组成的表,其中包括两个日期(startDate和endDate)。两个日期之间的MSSQL索引

该表包含15.000.000条记录。

我的查询是这样的

SELECT ID FROM table WHERE @inputdate BETWEEN startDate and endDate 

设置我的指标应该如何进行设置,以最大限度地提高性能?

+1

创建独特的非聚集索引[UIX_TABLE_StartDateEndDate] ON [DBO] [表]([开始日期] ASC,[结束日期] ASC)包括:([ID])是这样一个好的开始。为了最大限度地提高性能,您必须分析负载,也许您可​​以通过较小的推文来改善它 – jean

+0

告诉我们更多关于您的数据的信息。开始和结束之间的时间间隔是多少?它是有限的吗(例如,在同一天,同一周或同一周)或者它可以是任何东西,比如几年? – Ben

回答

1

将我的评论延伸至答案。

CREATE UNIQUE NONCLUSTERED INDEX 
[UIX_TABLE_StartDateEndDate] 
ON [dbo].[TABLE] 
([StartDate] ASC, [EndDate] ASC) 
INCLUDE([ID]) 

是一个好的开始。为了最大限度地提高性能,你必须分析负载,也许你可以改善它与微小的tweeks,如设置填充因子填充等。

从开始的另一个不错的选择是如果您的日期列可以为空,并且您从不搜索空值。可以应用过滤器的索引等

CREATE UNIQUE NONCLUSTERED INDEX 
    [UIX_TABLE_StartDateEndDate] 
    ON [dbo].[TABLE] 
    ([StartDate] ASC, [EndDate] ASC) 
    INCLUDE([ID]) 
WHERE ([StartDate] IS NOT NULL AND [EndDate] IS NOT NULL)