1

約 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 ミリ秒程度) 返され、その結果セットは次の読み込みまでキャッシュされます。

ただし、データ ウェアハウジングの経験が豊富な人は、より最適なソリューションを持っている可能性があると推測しています。

4

3 に答える 3

1

Another option would be to have another table (Region, FileDate) which holds the most recent FileDate for each Region. You would update this table during your load.

于 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 に答える