約 80 列の非正規化テーブルがあり、1 か月あたり約 1,000 万行 (約 5GB) の割合で増加するとします。現在、3 年半分のデータ (~4 億行、~200 GB) があります。
主キーとして機能する次の列のテーブルからデータを取得するのに最適なクラスター化インデックスを作成します...
[FileDate] ASC,
[Region] ASC,
[KeyValue1] ASC,
[KeyValue2] ASC
...テーブルをクエリすると、常に主キー全体が得られるためです。
そのため、これらのクエリは常にクラスター化されたインデックス シークになるため、非常に高速であり、断片化は最小限に抑えられます。ただし、通常はレポートのために、すべてのリージョンの最新の FileDate を取得したい状況があります。
SELECT
[Region]
, MAX([FileDate]) AS [FileDate]
FROM
HugeTable
GROUP BY
[Region]
これに思いつく「最善の」解決策は、リージョンに非クラスター化インデックスを作成することです。これは、ロード中にテーブルに追加の挿入が行われることを意味しますが、ヒットは最小ではありません (1 日に 4 回ロードするため、ロードごとの追加のインデックス挿入は 100,000 未満です)。テーブルも FileDate によって分割されているため、クエリの結果は十分に速く (200 ミリ秒程度) 返され、その結果セットは次の読み込みまでキャッシュされます。
ただし、データ ウェアハウジングの経験が豊富な人は、より最適なソリューションを持っている可能性があると推測しています。