web-dev-qa-db-ja.com

MSSQLで大きなレポート期間を処理するための手法

かなり大きなテーブル(数億行)を持つかなり大きなデータベースがあります。それらのテーブルのいくつかは報告されます。

これを可能な限り高速にするためのインデックスが用意されていますが、達成できることには限界があります。そのため、ユーザーごとに1か月分のデータにレポートを制限しています。

1年以上、または1年前と比較するなど、より大きなスケールでレポートを作成する方法を見つけようとしています。

これを達成する唯一の方法は、データを何らかの方法で集計にまとめることです。そのため、1日に5つのデータポイントの代わりに、日、週、月ごとに1つの集計データポイントを保存できます。

このオプションは、タイムゾーンを考慮するまではすばらしいようです。すべてのデータはUTCで保存されますが、ユーザーは同僚とは別のタイムゾーンにいる可能性があります。使用中のタイムゾーンごとに1回集計できると思っていましたが、その後、データは再び這い上がります。

この種の作業にはいくつかのベストプラクティスがあると確信していますが、それらを発掘することができませんでした。

追加情報:

  • サーバー:MSSQL
  • スタック.NETのコーディング
  • SSISは使用しません
2
Chris

この種のレポート作成作業の標準的な手法は、必要な集計を定義し、定期的にそれらを段階的に計算して結果を保存することです。次に、レポートを準備するときが来たら、これらの保存された結果から(少なくとも可能な限り)レポートを組み立てます。

より長い範囲の集計の計算自体は、より小さい範囲をカバーする格納された集計を使用する場合があります。たとえば、年次集計の計算では生データは使用されず、以前に生データから準備された月次集計が使用されます。

タイムゾーンの問題により、これは実現不可能であると確信しているようですが、これが本当かどうかは、提供した情報からは明らかではありません。

年次または3年ごとのレポートを希望する人は、年のしきい値がさまざまなタイムゾーンで発生するものとして扱われる時期の違いに基づく小さな不正確さを許容する可能性があります-特に、代替案がまったくレポートを取得しない場合。

結果を正確にする必要がある場合でも、UTCの年次集計を正しい値の概算として使用し、年のいずれかの終わりに詳細データを検索して、必要な少数の値を加算および減算することができます。 「現地年」の正しい合計値を設定します。

3
Steve