1

假设我们有一个包含大约 80 列的非规范化表,并且以每月约 1000 万行(约 5GB)的速度增长。我们目前有 3 1/2 年的数据(~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 分区,因此我们的查询结果很快就会返回(大约 200 毫秒),并且该结果集会被缓存到下一次加载。

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

4

3 回答 3

1

另一种选择是有另一个表(Region, FileDate),其中包含FileDate每个Region. 您将在加载期间更新此表。

于 2009-11-12T19:28:05.363 回答
1

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

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

于 2009-11-12T19:47:22.203 回答
0

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

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

于 2009-11-15T11:06:51.593 回答