2

SSIS を使用して、フラット ファイルから SQL テーブルにデータをロードしています。フラット ファイルには、新しい行と更新された行の両方が含まれています。プロセスが実行されるたびに、更新された行は「期間」列で指定された SQL テーブルの小さなサブセットに影響します (たとえば、1 つのプロシージャは期間 3、4、および 5 にのみ影響する場合があります)。

ルックアップ変換を使用して、新しい行 (Lookup No Match Output) を既存の行 (Lookup Match Output) から分離しています。参照セットと読み込まれるデータ セットの両方が非常に大きいため、ルックアップに部分キャッシュを使用したいと考えています。フラットファイルに含まれる期間番号からの行のみを含めるように部分キャッシュクエリを変更することは何とか可能ですか?

たとえば、参照テーブルには期間 1 ~ 10 のデータが含まれている可能性がありますが、ロードされているフラット ファイルには期間 3 ~ 5 のデータしか含まれていない場合があります。したがって、期間 1 ~ 2 と 6 ~ 10 では一致しないことがわかっているため、期間 3 ~ 5 のデータのみをキャッシュしたいと考えています。

4

2 に答える 2

2

ドロップダウンでテーブル セレクターを使用する代わりに、すべての行のすべての列が必要でない限り使用すべきではありませんが、クエリを記述して、既存のデータの照合または拡張に必要な列のみを取得します。あなたの場合、少し厄介なフィルターを追加する必要があります。

私が見つけた最善の方法は、ルックアップ クエリを String 型の変数に記述することです。その中で、クエリを作成し、必要なフィルターを適用します。以下では、2 つの変数を定義したことがわかります。1 つはフィルターとして機能する int で、次にそれを使用するクエリ自体です。

ここに画像の説明を入力

私のSourceQuery変数の式は

"SELECT 
    D.rn
FROM
(
SELECT TOP 10
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL))  * 2 AS rn
FROM
    sys.all_columns AS SA
) AS D(rn) 
WHERE D.rn <= " + (DT_WSTR, 10) @[User::MaxID]

私のデータフローは次のようになります

ここに画像の説明を入力

ソースがあり、ルックアップにヒットし、一致した結果に基づいて 2 つのバケットのいずれかに移動します。ソース クエリは 1 から 10 の数字を生成するだけで、ルックアップは 2 から 20 の偶数を生成するクエリです。

設計時には、そのクエリは次のようになります

SELECT 
    D.rn
FROM
(
SELECT TOP 10
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL))  * 2 AS rn
FROM
    sys.all_columns AS SA
) AS D(rn) 

通常の実行では、バケット間で 50/50 の分割が発生します

ここに画像の説明を入力

もちろん、目標はルックアップ クエリがソース コンポーネントの 1 つのようなパラメータを取るようにすることですが、すぐにそれがわかるでしょう。

SELECT 
    D.rn
FROM
(
SELECT TOP 10
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL))  * 2 AS rn
FROM
    sys.all_columns AS SA
) AS D(rn) 
WHERE D.rn > ?

飛ばない。代わりに、制御フローに戻ってデータ フローを選択し、右クリックして [プロパティ] を選択する必要があります。データ フローのウィンドウで、[式] に移動し、省略記号 (...) をクリックします。

ここに画像の説明を入力

ルックアップ タスクとして名前が付けられたプロパティがあります。式を使用する変数を割り当てて、すべてを動的にして出来上がりにします。maxid は 6 です。3 つの一致しか見つかりません

ここに画像の説明を入力

最後に、部分キャッシュは、探しているものである場合とそうでない場合があります。これは、ルックアップ データのコストとローカル キャッシュのバランスをどのように取るかを制御する実際のルックアップ設定です。フル キャッシュは、該当する範囲の指定されたすべての列をメモリにドロップするため、必要な列のみを指定する必要があります。数列、数百万行にまで削減できれば、おそらく苦労することはないでしょう。

于 2013-10-24T19:58:33.977 に答える
1

考案された例:

  1. 実行時に期間の最小値と最大値を収集し、それらを PeriodMinimum と PeriodMaximum の 2 つの変数に格納します (これは範囲であると想定しています。代替案については最後に説明します)。
  2. それらを派生列としてソース フローに追加します。
  3. ルックアップ エディターの [詳細設定] タブで、カスタム クエリを使用します (不自然な例): SELECT ルックアップ、値 FROM 参照、期間 ? と ?
  4. [パラメーター] ボタンをクリックし、入力列を適切に使用します。

範囲の代わりに期間 (3、6、および 10) をランダムに選択できるようにしたい場合は、もう少し不自然なことをする必要があります...

  1. 複数の変数 Period1、2、3 ... n を作成し、デフォルトを -1 または有効な期間ではない値に設定します。
  2. 必要に応じて、これらの変数にフィルターをかけたい期間を入力します。
  3. カスタム クエリでは、SELECT ルックアップ、value FROM 参照を使用します。ここで、期間 = ? またはピリオド = ? または期間 = ?, ...
  4. 入力列を使用して各パラメーターを設定します。

とにかく、一般的に、実行時データに基づいた動的ルックアップ クエリが必要な場合は、パラメーターを使用してカスタム クエリを使用します。

于 2013-10-24T19:53:28.093 に答える