0

我的表中有大约 3.65 亿行,并且在数据使用一年后,我们每天都会添加额外的 10 万行,它会被移动到存档数据的不同表中。

我在 DataCollectionID 上有一个 PK 聚集索引。

我还有另一个索引:AssetID、DataPointID 和 DatapointDate 上的唯一非聚集索引

我需要非常快速地对表运行多个选择查询......这是我的选择查询:

SELECT [DataPointID]
  ,[SourceTag]
  ,[DatapointDate]
  ,[DataPointValue]
FROM DataCollection
Where 
  DatapointDate >= '2012-09-07' AND 
  DatapointDate < '2012-09-08' AND
  DataPointID = 1100
ORDER BY DatapointDate

此查询应返回 8,640 行,但执行时间为 00:00:08(8 秒)。即使我说给我前 10 名,它仍然需要 8 秒。有人可以帮我加快这个过程吗?

4

3 回答 3

3

我认为帮助此查询的更有效索引将按 DataPointID、DataPointDate 的顺序排列。这将允许优化器在第一个索引列上使用相等运算符快速缩小字段范围,然后找到该集合内的日期范围。

这里有一些很好的索引和类似查询示例:

http://sqlserverpedia.com/wiki/Index_Selectivity_and_Column_Order

于 2012-09-11T16:17:37.187 回答
0

如果这是动态 SQL,则应将其放入存储过程中,并记得使用SET NOCOUNT ON.

否则,这听起来像是硬件问题:在这种情况下,更多内存可能会有所帮助。

于 2012-09-11T16:10:03.987 回答
0

您需要一个更好的覆盖索引,例如:

create index _idx ON DataCollection ( DataPointDate, DataPointId )
include ( SourceTag, DataPointValue )

您通常希望在索引的前面有最具选择性(即最独特)的列,因此这可能是 dataPointDate 或 dataPointId ,具体取决于您的数据。

于 2012-09-11T16:28:12.903 回答