假设我们有一个约80列的非规范化表,并以每月约1000万行(约5GB)的速度增长。我们目前有3年半的数据(~400M行,~200GB)。
我们创建一个聚簇索引,以便最适合从以下列中的表中检索数据作为我们的主键......
[FileDate] ASC,
[Region] ASC,
[KeyValue1] ASC,
[KeyValue2] ASC
...因为当我们查询表格时,我们总是拥有整个主键。
因此,这些查询总是会导致聚簇索引搜索,因此非常快,并且碎片保持最小。但是,我们确实需要为每个区域获取最新的FileDate,通常用于报告,即
SELECT
[Region]
, MAX([FileDate]) AS [FileDate]
FROM
HugeTable
GROUP BY
[Region]
我能做到的“最佳”解决方案是在Region上创建非聚集索引。虽然这意味着在加载期间桌面上会有额外的插入,但命中率并不是最小的(我们每天加载4次,因此每次加载的附加索引插入次数少于100,000次)。由于表也是由FileDate分区的,因此我们的查询结果可以快速返回(大约200ms),并且结果集将被缓存,直到下一次加载。
然而,我猜测拥有更多数据仓库经验的人可能会有一个更优化的解决方案,因为出于某种原因,这并不“感觉正确”。
答案 0 :(得分:1)
另一种选择是让另一个表(Region, FileDate)
保存每个FileDate
的最新Region
。您可以在加载期间更新此表。
答案 1 :(得分:1)
我会在(Region,FileDate)上创建覆盖索引(非聚集),而不仅仅是区域。 但是,它会很大,因为你有一个很宽的聚类键。
否则,尝试AdamRalph的想法,但我认为这是超过另一个指数的开销
答案 2 :(得分:0)
您是否有机会在Analysis Services中构建多维数据集,并针对多维数据集运行聚合查询?
查询应该更快,尽管从数据更改到多维数据集完成更新时会有延迟。