使用日期改进查询表

时间:2015-08-12 13:41:25

标签: sql-server

我有一个包含大量数据的表,我想使用日期范围查询它。

这是查询

SELECT TOP (10000) 
    [PositionId] AS [PositionId], 
    [DeviceId] AS [DeviceId],     
    [Course] AS [Course], 
    [Latitude] AS [Latitude], 
    [Longitude] AS [Longitude], 
    [Speed] AS [Speed], 
    [MomentTiming] AS [MomentTiming],                             
    [Fuel] AS [Fuel], 
    [Ignition] AS [Ignition]        
 FROM
    [PositionInsights]
 WHERE
    deviceId = 352 
    AND [MomentTiming] >= '8/12/2015 7:38:00 AM' 
    AND [MomentTiming] <= '8/12/2015 3:38:00 PM'

问题是这个简单的查询需要花费太多时间,大约35秒

1 个答案:

答案 0 :(得分:1)

作为一般规则,应该将where子句中的任何字段编入索引。如果你在表上做了很多CRUD,你应该确保索引不会随着时间的推移而碎片化。 所以我会创建两个单独的索引,一个在deviceid字段上,另一个在MomentTiming字段上。 如果您的表是数百万或数十亿行,您可能希望在其中一个字段上设置表分区。如果deviceid字段是自动编号字段,那么这可能是一个足够好的范围分区值,否则在MomentTiming日期字段上进行分区。如果进行分区,请保持索引与我描述的相同。

更新:因为你只有数百万行,而不是数十亿行,所以只需从索引开始,看看会发生什么。但是,如果您的数据快速增长,您可能还是希望查看分区。此外,如果您进入分区路径,则应尝试将不同的文件放在不同的挂载点上以获得最佳性能。

HTH