我的表格中有大约3.65亿行,每天我们在数据为一年后添加额外的百万行,它会被移动到另一个存档我们数据的表格。
我在DataCollectionID上有一个PK Clustered索引。
我有另一个索引: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秒。有人可以帮我加快这个过程吗?
答案 0 :(得分:3)
我认为帮助此查询的更有效的索引将依次是DataPointID,DataPointDate。这将允许优化器使用第一个索引列上的相等运算符快速缩小字段范围,然后在该集合中查找日期范围。
这里有一些很好的索引和类似查询示例:
http://sqlserverpedia.com/wiki/Index_Selectivity_and_Column_Order
答案 1 :(得分:0)
如果这是动态SQL,则应将其放入存储过程中,并记住使用SET NOCOUNT ON
。
否则听起来像硬件问题:在这种情况下,更多内存可能会有所帮助。
答案 2 :(得分:0)
您需要更好的覆盖索引,例如:
create index _idx ON DataCollection ( DataPointDate, DataPointId )
include ( SourceTag, DataPointValue )
您通常需要索引前面最具选择性(即最独特)的列,因此根据您的数据,这可能是dataPointDate或dataPointId。