0

各行を既存のテーブルの 2 列 (開始列と終了列) と比較するために、フラット ファイル (1 列のみ) をインポート/使用する必要がある SSIS パッケージを開発する必要があります。

フラットファイルデータ -

110000
111112
111113
112222
112525
113222
113434
113453
114343
114545

そして、フラットファイルの各行を構造/データと比較します -

id  start   end
8   110000  119099
8   119200  119999
3   200000  209999
3   200000  209999
2   300000  300049
2   770000  779999
2   870000  879999

さて、これを非常に単純な単純なストアド プロシージャで実装する必要がある場合は、SSIS パッケージで実装した場合、これを理解することができません。

何か案は?どんな助けでも大歓迎です。

4

1 に答える 1

0

コアでは、ルックアップ コンポーネントを使用する必要があります。クエリを作成し、SELECT T.id, T.start, T.end FROM dbo.MyTable AS Tそれをソースとして使用します。入力列を列にマップstartし、データ フローに追加されるように ID を選択します。

実行を押すと、正確なルックアップが実行され、110000 と 119200 の値のみが検索されます。範囲クエリに変換するには、[詳細設定] タブに移動する必要があります。チェックできる項目は 3 つあります。メモリの量、行、およびクエリのカスタマイズです。最後のものを確認すると、次のようなクエリを取得する必要があります

SELECT * FROM 
(SELECT T.id, T.start, T.end FROM dbo.MyTable AS T`) AS ref 
WHERE ref.start = ?

になるように変更する必要があります。

SELECT * FROM 
(SELECT T.id, T.start, T.end FROM dbo.MyTable AS T`) AS ref 
WHERE ? BETWEEN ref.start AND ref.end

ソースファイルに 110001、110002、110003 があった場合、データベースに送信された 3 つの一意のクエリが表示されます。小さなデータ セットの場合、それはそれほど悪くないかもしれませんが、DW の読み込み時間が長くなりました。

これに代わる方法は、範囲を分解することです。私にとっては、日付範囲のみを保持するソース システムがあり、特定のカウントが何であるかを日ごとに知る必要がありました。範囲ルックアップのパフォーマンスがよくなかったので、2010-01-01 から 2013-07-07 の範囲の単一行を、それぞれ単一の日付 2013-01-01、2013-01 を持つ多数の行に変換するクエリを作成しました。 -02... このアプローチでは、実行前のフェーズが長くなりますが (過去 5 年間、クエリで 1 日あたり約 30k 行を生成する必要があったため、数分かかりました)、ローカルにキャッシュされると、検索は単純なシークでした。日ごとの特定のトランザクション。

できれば、数値テーブルを作成し、int の最大値まで入力して完了しますが、インライン テーブル値関数を使用してnumbers を生成するだけで済む場合があります。クエリは次のようになります

SELECT
    T.id
,   GN.number 
FROM 
    dbo.MyTable AS T
    INNER JOIN
        -- Make this big enough to satisfy your theoretical ranges
        dbo.GenerateNumbers(1000000) AS GN
        ON GN.number BETWEEN T.start and T.end;

これは、高度な機能を必要とせずに「ストレート」ルックアップで使用されます。ただし、ルックアップは非常にメモリを消費するため、クエリをできるだけタイトにします。たとえば、値が int に収まることがわかっている場合は、ソース クエリで GN.number を bigint から int にキャストします。

于 2013-07-08T01:47:39.360 に答える