我有一个包含大量数据的表,我想使用日期范围查询它。
这是查询
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秒
答案 0 :(得分:1)
作为一般规则,应该将where子句中的任何字段编入索引。如果你在表上做了很多CRUD,你应该确保索引不会随着时间的推移而碎片化。 所以我会创建两个单独的索引,一个在deviceid字段上,另一个在MomentTiming字段上。 如果您的表是数百万或数十亿行,您可能希望在其中一个字段上设置表分区。如果deviceid字段是自动编号字段,那么这可能是一个足够好的范围分区值,否则在MomentTiming日期字段上进行分区。如果进行分区,请保持索引与我描述的相同。
更新:因为你只有数百万行,而不是数十亿行,所以只需从索引开始,看看会发生什么。但是,如果您的数据快速增长,您可能还是希望查看分区。此外,如果您进入分区路径,则应尝试将不同的文件放在不同的挂载点上以获得最佳性能。
HTH