2

データウェアハウスに格納されている計算値をいつ計算するかに関するいくつかのベストプラクティスを誰かが教えてくれることを期待していました。

次の例を考えてみましょう。

CREATE TABLE
(
    MyFactID INT NOT NULL IDENTITY(1, 1),
    OrderDimID INT NOT NULL, -- FK To OrderDimension
    StartDate DATETIME NOT NULL,
    CompletedDate DATETIME NULL,
    ElapsedCalendarTimeInMinutes INT NULL,
    ElapsedBusinessTimeInMinutes INT NULL
)

この例では、経過カレンダー時間(分単位)は、開始日から終了日までの時間(分単位)になります。そして、私たちの営業時間は、それらの暦日の間に利用可能だった労働時間を反映しています。

現在、ETL中にこれを計算し、両方の日付を挿入しています。これがこの操作を実行するための正しい場所であるかどうか疑問に思います。

他のいくつかの考えは次のとおりでした:

A)開始日と終了日のみをファクトテーブルに保存し、経過時間を分単位で計算し、関数を使用して営業日を計算する計算列を持つビューを作成することにより、インデックス付きビューを使用します。

B)Afterトリガーを使用して、挿入が発生した後の経過カレンダー時間と営業時間を更新します。これにより、完了日がnull以外の値に挿入または更新されます。

終了日や営業時間の計算に変更があった場合に反映されるように、DBで行う必要があると思います。ETL中にそれを行うと、問題が発生しやすくなるようです。

これについての考えは大歓迎です!

更新:この方法で決定された少なくとも6つの列があります。営業時間、営業時間、日数があります(営業日は12時間です。次に、クライアントの分、時間、および日があります(クライアントの稼働時間のルックアップテーブルを介して決定されます)。次に、単純にカレンダーの分、時間、日があります(ただし、これらは保存されていません。分のみです)。これはDWであるため、すべてのデータが存在し、計算を必要としないことを期待していました。私には、計算された情報を取得するためにベースデータの上にビューを作成するよりも、ETLが正しく、どこにでも適用されるようにする方が作業のように思えます。

4

2 に答える 2

3

最も簡単な方法が最善の解決策です。

ETLプロセスで(これがSSISであると仮定しますが、他のテクノロジに外挿することができます):

  1. 運用データベースから舞台裏のデータウェアハウスにテーブルをコピーするためのデータフローを作成します。
  2. T-Sqlタスクを使用してファクトテーブルを更新します。マージステートメントで十分です。

マージサンプル:

MERGE Target AS T
USING Source AS S
ON ( __  matching criteria ___) 
WHEN NOT MATCHED BY TARGET
    THEN INSERT( OrderDimID, startDate, ... ) VALUES( ... )
WHEN MATCHED 
    THEN UPDATE SET T.ElapsedCalendarTimeInMinutes = ___some calculations___
WHEN NOT MATCHED BY SOURCE
    THEN DELETE (?)

これにより、トリガーとインデックス付きビューが回避されます。

于 2012-08-23T19:25:15.027 に答える
0

計算列、http://msdn.microsoft.com/en-us/library/ms191250 (v = sql.100).aspxを使用できます。非永続化と永続化の2つのフレーバーがあります。非永続化は、データを照会するときに計算を実行します。Persistedは、挿入時に値を格納してから、基になる数式データへの変更に基づいて更新します。データウェアハウスアプリケーションの場合、永続化することをお勧めします。

于 2012-08-29T19:36:03.370 に答える