如何提高非规范化表上的非标量聚合的性能

时间:2009-11-12 19:16:05

标签: sql sql-server sql-server-2005 indexing data-warehouse

假设我们有一个约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),并且结果集将被缓存,直到下一次加载。

然而,我猜测拥有更多数据仓库经验的人可能会有一个更优化的解决方案,因为出于某种原因,这并不“感觉正确”。

3 个答案:

答案 0 :(得分:1)

另一种选择是让另一个表(Region, FileDate)保存每个FileDate的最新Region。您可以在加载期间更新此表。

答案 1 :(得分:1)

我会在(Region,FileDate)上创建覆盖索引(非聚集),而不仅仅是区域。 但是,它会很大,因为你有一个很宽的聚类键。

否则,尝试AdamRalph的想法,但我认为这是超过另一个指数的开销

答案 2 :(得分:0)

您是否有机会在Analysis Services中构建多维数据集,并针对多维数据集运行聚合查询?

查询应该更快,尽管从数据更改到多维数据集完成更新时会有延迟。