我的MS SQL数据库中有一个很大的表(> 1亿行),其中包含以下各列:
Id int not null,
ObjectId int not null,
Timestamp datetime not null
State int not null
Id
它是表的主键(并具有聚簇索引)。我在Timestamp和ObjectId上添加了非聚集索引(按此顺序)。中大约有2000个不同的值ObjectId
。我现在要执行以下查询:
SELECT ObjectId, MAX(Timestamp) FROM Table GROUP BY ObjectId
它大约需要四秒钟,这对于我的应用程序来说太慢了。执行计划表明,97%的运行时用于非聚集索引的索引扫描。
在表的副本上,我在ObjectId和Timestamp上创建了聚集索引。结果运行时是相同的,执行计划说它现在正在对聚集索引进行索引扫描。
在不将表的数据拆分成多个表的情况下,还有其他改进运行时间的可能性吗?
我可以为您提供另一个答案,添加一个布尔列LAST并将ObjectID的last true更新为false,然后为此对象ID的LAST now插入now行。在ObjectID和LAST上创建索引。查询非常简单:
SELECT ObjectId, Timestamp FROM Table where LAST = true
没有更多的分组依据和全扫描,但每个插入又更新了一个。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句