DWHにおける時間性(Temporality)第4部:SCD Type 2ディメンションの出力とPIT/PIT+

KimballスタイルのSCD Type 2ディメンションをData Vaultから出力する実践手法:PITテーブル、PIT+の設計、複数ハブをまたぐテンポラルJOINの極意を解説。

DWHにおける時間性(Temporality)第4部:SCD Type 2ディメンションの出力とPIT/PIT+

Kimballスタイルのディメンション — SCD Type 2の出力

本連載のこれまでの記事をまだご覧になっていない方は、まず最初の3部をお読みいただくことを強くお勧めします:

はじめに

このテーマについて、歴史、モデリング、パフォーマンスの考慮事項を含めて9ページにわたる原稿を執筆した結果、あまりに情報量が多すぎると気づきました。そこで、要点を簡潔な箇条書きへと凝縮しました。

なお、本稿で解説するような複雑な作業をすべて自動化したい場合は、これらをすべて背後で自動処理するDWH自動化スイート「Datavault Builder」のご利用をお勧めします。

※以下で「PITテーブル」と記述している部分は、ビュー(View)で代替することも可能です。その場合、テーブルへのロード処理が不要になる代わりにクエリパフォーマンスは低下します。また、「ディメンション」と記述している部分はファクトにも同様に適用できます。

PITおよびPIT+の作成

独自に実装する場合の重要な知見をまとめます:

  • 本連載の第1〜3部を再確認し、本当にSCD Type 2の出力が必要なのかをまず検証してください。 明確なビジネス価値がない場合、レポートを無意味に複雑化させるだけです。
  • PITテーブルは目的ではなく、単なる手段に過ぎません。 真の目的は「SCD Type 2ディメンション」です。ツールや担当者に対して「PITテーブルを作れるか」と尋ねるのではなく、「要件を満たすSCD Type 2ディメンションを生成できるか」を問うべきです。
  • PITテーブルは、SCD Type 2出力を高速化するための有効な手段です。
  • PITテーブルを作成する場合、SCD Type 2出力が真に必要な粒度(ハブ)に対してのみ作成してください。
  • PITテーブルには、対象のSCD Type 2ディメンション出力に関与する要素(特定のサテライトやリンク)のタイムスライスのみを含めてください。事前にビジネス要件を明確に収集することが前提となります。
  • 月末スナップショットなど特定時点のみを参照する場合はスナップショット型PITも選択肢になりますが、柔軟性を最大化するためには「連続型(Continuous)SCD Type 2 PITテーブル」を作成することを推奨します。連続型からはスナップショットを容易に抽出できますが、逆は不可能だからです。

Datavault Builder:SCD Type 2ディメンション出力のためのサテライト属性のビジュアル選択 Datavault Builderにおける属性の直感的なビジュアル選択画面

  • SCD Type 2ディメンションでどのカラムを出力すべきか定まっておらず、PITにどのサテライトを含めるべきか判断できない場合は、複雑性を排除する第2部の設計方針に立ち戻ってください。
  • PITテーブルを作成する際は、多対1(Many-to-One)および1対1(One-to-One)のリンクにおけるターゲットハッシュ値およびその履歴も含めてください。これらは後で複数のPITテーブルを結合する際に不可欠となります。筆者はこれを**「PIT+」**と呼んでいます。

PIT+の構造図:多対1および1対1リレーションのサテライトとリンク先ハッシュを含むハブ 多対1および1対1リレーションのためにサテライトとリンク先ハッシュをPITに含める構成

複数のPITの結合(Joining PITs)

  • モデル内のリンクが持つカーディナリティ(多重度)を把握していない場合、重大なトラブルを招きます。
  • DWHタイムライン(3d: Load Time)を基準とする場合、ロード日時は常に未来に向かって進むため、新規レコードを追加するだけの増分デルタロードが可能です。
  • PITのクエリ性能向上のためにサテライトへゴーストレコードを挿入する手法について、私たちが検証した主要DBプラットフォーム(Snowflake、Exasol、Oracle、MSSQL)では、通常のLEFT JOINと比較して有意な性能差は見られませんでした(※環境により異なる場合があります)。
  • SCD Type 2ディメンションが複数の異なる粒度(異なるハブに接続されたサテライト群)のカラムを必要とする場合、テンポラルJOIN(時間軸結合)を用いてハブのペアを順次交差させ、単一の結合タイムラインを生成します。この演算は可換です:(((A ⋈ B) ⋈ C) ⋈ D) = (((A ⋈ D) ⋈ B) ⋈ C)

Data Vaultリンク関係:複数粒度のSCD Type 2出力のためのハブ間テンポラル結合

  • 最後に、この統合された履歴テーブルに必要なすべてのサテライトを結合し、目的の属性を取得します。
  • 必要に応じて、不要な中間タイムスライスをマージ・削除(コンパクション)することも可能です。レポートツールへ転送する行数を削減できますが、そのまま出力しても論理的には完全に正確です。

これらをすべて自力で正しく実装できれば素晴らしい成果です。

次の課題は、「SCD Type 1またはType 2のファクトと、SCD Type 2ディメンションをどのように結合するか」です。これについては、本記事の内容を消化した後の別記事にて取り上げたいと思います。


※本検証と異なる性能検証結果をお持ちの方がいらっしゃいましたら、知見を共有いただけますと幸いです。また、検証用スクリプトにご興味のある方にもオープンに共有しています。