我有一个表,其中保存了一段时间以来发生的事件的历史,例如:
EventType | OccurredOn | Other.. | Data..
--------------------------------------------
1 | 2014/10/02 09:00 | foo | bar
1 | 2014/10/02 10:00 | foo | bar
2 | 2014/10/03 09:00 | foo | bar
1 | 2014/10/04 09:00 | foo | bar
3 | 2014/10/05 09:00 | foo | bar
2 | 2014/10/05 09:00 | foo | bar
4 | 2014/10/05 09:00 | foo | bar我在这个表上的所有查询都是如下形式的:
select [OccurredOn], [OtherData]
from [Data]
where [EventType] = @type and [OccurredOn] between @start and @end也许,使用grouping和选择聚合数据。
行几乎总是按时间顺序插入,当它们被按时间顺序插入时,OccurredOn应该是合理的“最近的”--也就是说,在“最新”行已经插入之前不太远。
如何对此表进行索引以进行有效的选择?
想必我的PK应该是集群的,并且包括OccurredOn它,但是没有自然唯一的键,所以我大概也需要一个autoincrement int列吗?
更新
就行而言,该表将有数百万,可能有10/百万。
我使用的是Server 208R2
发布于 2016-09-15 20:57:35
第一件事- OccurredOn时间可以有重复的值。
从下面开始,分析执行计划,以便稍后对其进行调整。
我建议添加一个代理/代理密钥,这是一个自动累进标识列-让我们将它命名为"NewColumn“。将这个"NewColumn“保留为Primary Key。将主键保持为Non-Clustered。
使用列(OccurredOn,NewColumn)创建一个OccurredOn。此聚集索引有助于搜索日期范围。
在聚集索引上保留"OccurredOn“有助于保持聚集索引不断增加的顺序。
保持NewColumn与OccurredOn一起,有助于使聚集索引具有唯一性。这有助于避免Server自行添加统一器(在非唯一聚集索引的情况下)。
参考资料
https://stackoverflow.com/questions/26165373
复制相似问题