サロゲートキーのルックアップの実装

以下の方式はある種の前提におけるものですが、基本的な実装方式としてお勧めできます。
記憶から書き出していますので記述漏れがあるかもしれませんが大部分はカバーできていると思います。


・ファクトテーブル−ディメンションテーブル間では参照整合性制約を設定しない。
サロゲートキーのルックアップにはSSISの参照変換コンポーネントを使う。
SSIS参照変換コンポーネントの「詳細設定」の「カスタムクエリ」では以下のWHERE句を使用する。
 WHERE [ビジネスキー] = ? AND [有効開始日] <= ? AND [有効終了日] >= ?
 (※性能を重視する場合は別の選択肢を採りますので誤解のないようにお願いします)
・「カスタムクエリ」を使う都合上、キャッシュモードは「部分キャッシュ」となる
SSIS参照変換コンポーネントの「全般」の「エントリが一致しない行の...」は「エラーを無視する」を使用する。
・変換先コンポーネントでは「NULLを保持する」をOFF(既定値)にする。
・変換先コンポーネントでの挿入先テーブル(ステージング)では、サロゲートキー列には初期値(ゼロ)を設定しておく。
・ディメンションテーブルではサロゲートキー値ゼロのデータ(UnknownMember)を用意しておく。
・ディメンションテーブルのサロゲートキー列はIDENTITY(1, 1)とする(ゼロは生成されません)。


せっかく用意されているSSASのUnknownMemberの仕組みを使わずに自作する!のです。


(追記)SQL実行タスク、LEFT OUTER JOIN 、ISNULL([サロゲートキー], 0) でも良いですね。→これだとSSIS使わないですね...


(追記)高速化のアイデア
・キャッシュモードを「フルキャッシュ」にする
・キャッシュ接続マネージャを使う
・キャッシュ変換コンポーネントを使用して事前にキャッシュファイル(caw)の内容を整える
・「カスタムクエリ」は使えない(これが理由というわけでもないが)ので、キャッシュ変換コンポーネントでキャッシュファイルに与えるデータを「該当する日付」や「最新の日付」でフィルタしておく
・参照変換コンポーネントではビジネスキーの一致のみで判断できる
・キャッシュファイルの配置先とかセキュリティとか面倒な感じ


(追記)Merge Join + Conditional Split の方が高速。けどプロパティ設定面倒そう。
MSDN Blogs > SSIS Team Blog > Lookup Pattern: Range Lookups
http://blogs.msdn.com/b/mattm/archive/2008/11/25/lookup-pattern-range-lookups.aspx