コアでは、ルックアップ コンポーネントを使用する必要があります。クエリを作成し、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 にキャストします。