假设我们有一个包含大约 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 毫秒),并且该结果集会被缓存到下一次加载。
但是,我猜想拥有更多数据仓库经验的人可能有一个更优化的解决方案,因为出于某种原因,这并不“感觉正确”。