私たちのデータウェアハウスは、データソースから蓄積されたデータを使用して(そして蓄積を反転する方法はありません)、スノーフレークスキーマを作成します。対処しなければならない要件は、日付範囲に基づいてレポートを作成するためにスキーマを使用できる必要があることです。
私たちのスキーマは次のようになります(簡略化):
+------------------------------------------+
| fact |
+-------+-----------------+----------------+
| id | statisticsDimId | dateRangeDimId |
+-------+-----------------+----------------+
| 1 | 1 | 10 |
| 2 | 2 | 11 |
| 3 | 3 | 12 |
| 4 | 4 | 13 |
| 5 | 5 | 14 |
| 6 | 5 | 15 |
| 7 | 5 | 16 |
| ... | ... | ... |
| 10001 | 9908 | 11 |
| 10002 | 9909 | 11 |
+-------+-----------------+----------------+
+-------------------------------------------------+
| date_range_dimension |
+-------+-----------------------------------------+
| id | startDateTime | endDateTime |
+-------+--------------------+--------------------+
| 10 | '2012-01-01 00:00' | '2012-01-01 23:59' |
| 11 | '2012-01-01 00:00' | '2012-01-02 23:59' |
| 12 | '2012-01-01 00:00' | '2012-01-03 23:59' |
| 13 | '2012-01-01 00:00' | '2012-01-04 23:59' |
| 14 | '2012-01-01 00:00' | '2012-01-05 23:59' |
| 15 | '2012-01-01 00:00' | '2012-01-06 23:59' |
| 16 | '2012-01-01 00:00' | '2012-01-07 23:59' |
| 17 | '2012-01-01 00:00' | '2012-01-08 23:59' |
| 18 | '2012-01-01 00:00' | '2012-01-09 23:59' |
| ... | ... | ... |
+-------+--------------------+--------------------+
+-----------------------------------------------------+
| statistics_dimension |
+-------+-------------------+-------------------+-----+
| id | accumulatedValue1 | accumulatedValue2 | ... |
+-------+-------------------+-------------------+-----+
| 1 | [not relevant] | [not relevant] | ... |
| 2 | [not relevant] | [not relevant] | ... |
| 3 | [not relevant] | [not relevant] | ... |
| 4 | [not relevant] | [not relevant] | ... |
| 5 | [not relevant] | [not relevant] | ... |
| 6 | [not relevant] | [not relevant] | ... |
| 7 | [not relevant] | [not relevant] | ... |
| ... | [not relevant] | [not relevant] | ... |
| ... | [not relevant] | [not relevant] | ... |
| 10001 | [not relevant] | [not relevant] | ... |
| 10002 | [not relevant] | [not relevant] | ... |
+-------+-------------------+-------------------+-----+
次のようなレポートデータセットを作成します。
SELECT *
FROM fact
INNER JOIN statistics_dimension
ON (fact.statisticsDimId = statistics_dimension.id)
INNER JOIN date_range_dimension
ON (fact.dateDimId = date_range_dimension.id)
WHERE
date_range_dimension.startDateTime = [start]
AND
date_range_dimension.endDateTime = [end]
問題は、統計ディメンションのデータがすでに蓄積されており、蓄積を元に戻すことができないことです。ファクトテーブルのおよその行数を計算し、5,250,137,022,180を取得しました。データには約250万の日付範囲の順列があり、累積のため、日付ディメンションとファクトテーブルにそれらを計算する必要があります。SQLのSUM関数は、累積のために機能しません(異なるセットに属する2つの値を追加することはできません)。
計算を実行可能にするために従うことができるベストプラクティスはありますか?スキーマ設計に何か問題がありますか?
オンライントレーニングに関するデータを報告する必要があります。データソースは、10年以上前の部品を使用するレガシーデータプロバイダーであるため、内部ロジックを再構築することはできません。統計ディメンションには、たとえば、Webベースのトレーニング(WBT)でユーザーが達成した進行状況(%)、WBTページあたりの呼び出し数、WBTのステータス(ユーザーの場合、「完了」など)が含まれます。 、 そう。データプロバイダーについて重要なことは、現在の状態のスナップショットを提供するだけです。過去のデータにアクセスすることはできません。