6

約 4 億行を含むデータ ウェアハウス ファクト テーブルのテーブル パーティション分割を実装しようとしています。当社の ETL は、前回のロードから 50 日さかのぼってソース システムからデータを取得します (ソース システムのタイムスタンプに基づいて、新しい行、変更された行)。そのため、ETL サイクルごとに、新しい行が入ってくるだけでなく、ファクト テーブル内の対応する行を更新している古い行もあります。アイデアは、新しい行を Fact テーブルに挿入し、変更された行を更新することです。

パーティション列は日付 (int, YYYYMMDD) になり、月ごとにパーティション化することを検討しています。

私の知る限り、テーブルのパーティショニングは、高速なパーティション切り替え操作による挿入を容易にします。最新のパーティションを分割して新しい空きパーティションを作成し、新しい行をステージング テーブルにロードし (たとえば最新の月などの日付制約を使用)、パーティション スイッチ操作を使用して新しい行をパーティション化された Fact テーブルに "移動" することができます。 . しかし、Fact テーブル内の対応する行を更新する必要がある変更された行をどのように処理すればよいでしょうか? これらの行には、前月のデータを含めることができます。ここでパーティションスイッチが役立ちますか? 通常INSERTUPDATE行は ETL ツール (この場合は SSIS) またはMERGEステートメントによって決定されます。この種の状況でパーティショニングはどのように機能しますか?

4

3 に答える 3

7

デザインをもう一度見て、更新を回避する方法があるかどうかを調べてみます. ファクト テーブルを更新すると、次のような影響があります。

パフォーマンス: 更新は完全にログに記録されたトランザクションです。大きなファクト テーブルには、読み書きするデータもたくさんあります。

キューブ: ファクト テーブルを更新するには、影響を受けるパーティションを再処理する必要があります。ファクト テーブルが拡大し続けるにつれて、キューブの処理時間も同様に増加し続けます。

予算: 高速ストレージは高価です。大きなファクト テーブルを更新するには、多くの高速な読み取りと書き込みが必要になります。

純粋主義者の理論: 初期値がエラーでない限り (つまり、ユーザーが $1,500 ではなく $15,000 を入力した場合)、ファクト テーブルを変更しないでください。エラー以外のシナリオでは、最初に記録されたトランザクションが変更されます。

何が変わっていますか?変化するピースは本当にディメンションの属性ですか? その場合、それらをディメンションに移動し、緩やかに変化するディメンション タイプのタスクで変更を処理できますか?

別の可能性として、これは相殺取引によって達成できますか? 例:

最初の InvoiceAmount は $10.00 でした。経理部は後で税金として 1.25 ドルを追加し、顧客に 11.25 ドルを請求しました。値を $11.25 に更新するのではなく、$1.25 のレコードを挿入します。請求書の合計金額は 11.25 ドルのままであり、完全にログに記録された更新ではなく、最小限のログに記録された挿入を行うことができます。

ファクト テーブルを更新することは、理論的には悪い考えであるだけでなく、ファクト テーブルが大きくなるにつれて非常にコストがかかり、拡張性がなくなります。より多くのデータを読み書きすることになり、ストレージ サブシステムからより多くの IOPS が必要になります。分析を行う準備が整うと、キューブ処理によってさらに多くの問題が発生します。

また、データ ウェアハウスにこれほど多くの IOPS が必要な理由を常に経営陣に説明する必要があります。絶え間なく変化する「ファクト」テーブルにこれらすべての IOPS を必要とするビジネス上の価値/正当性はありますか?

ファクト テーブルの更新を回避する方法が見つからない場合は、少なくとも、データが読み取り専用であると判断されるカットオフ ポイントを確立します。そうしないと、スケーリングできません。

于 2012-12-10T22:55:42.870 に答える
1

ここでは切り替えは役に立ちません。

異なる範囲の行で複数のスレッドを使用して、更新を同時に実行できる場合があります。それはそれをスピードアップするかもしれません。良好な同時実行性が得られるように、ロックのエスカレーションをトリガーしないように注意してください。

また、ほとんどの場合、クラスター化インデックスの昇順で行を更新するようにしてください。これは、ディスク IO に役立ちます (この手法は、マルチスレッドではうまく機能しない可能性があります)。

于 2012-12-10T20:45:29.070 に答える