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