こんにちはSSISパッケージは初めてで、パッケージを書いて、同時にそれらについて読んでいます。
DTS=をSSISパッケージに変換する必要があり、異なるデータベースからの2つのソースで結合を実行する必要があります。
表面上は非常によく似ています。 「結合」ではデータを事前にソートする必要がありますが、「ルックアップ」ではこれを必要としません。アドバイスは非常に役立ちます。ありがとうございました。
スクリーンショット#1は、Merge Join transformation
とLookup transformation
を区別するためのいくつかのポイントを示しています。
ルックアップについて:
ソース1入力に基づいてソース2で一致する行を検索する場合、およびすべての入力行に対して1つだけ一致することがわかっている場合は、ルックアップ操作を使用することをお勧めします。たとえば、OrderDetails
テーブルで、一致するOrder Id
とCustomer Number
を検索する場合、Lookupの方が適切なオプションです。
マージ結合について:
Address
テーブル内の特定の顧客のCustomer
テーブルからすべての住所(自宅、職場、その他)を取得するなどの結合を実行する場合、顧客は結合結合を使用する必要があります。 1つ以上のアドレスを関連付けることができます。
比較する例:
Merge Join
とLookup
のパフォーマンスの違いを示すシナリオを次に示します。ここで使用されるデータは、1対1の結合です。これは、比較する共通のシナリオです。
dbo.ItemPriceInfo
、dbo.ItemDiscountInfo
、dbo.ItemAmount
という名前の3つのテーブルがあります。これらのテーブルの作成スクリプトは、SQLスクリプトセクションで提供されます。
Tablesdbo.ItemPriceInfo
とdbo.ItemDiscountInfo
の両方に13,349,729行があります。両方のテーブルには、共通列としてItemNumberがあります。 ItemPriceInfoには価格情報があり、ItemDiscountInfoには割引情報があります。スクリーンショット#2は、これらの各テーブルの行数を示しています。スクリーンショット#3は、テーブルに存在するデータについてのアイデアを提供するために、上位6行を示しています。
マージ結合とルックアップ変換のパフォーマンスを比較するために、2つのSSISパッケージを作成しました。両方のパッケージは、テーブルdbo.ItemPriceInfo
およびdbo.ItemDiscountInfo
から情報を取得し、合計金額を計算して、テーブルdbo.ItemAmount
に保存する必要があります。
最初のパッケージはMerge Join
変換を使用し、内部ではINNER JOINを使用してデータを結合しました。スクリーンショット#4および#5はサンプルパッケージの実行と実行を示しています期間。 05
分14
秒かかりました719
ミリ秒で、マージ結合変換ベースのパッケージを実行します。
2番目のパッケージは、フルキャッシュを使用したLookup
変換を使用しました(これはデフォルト設定です)。 creenshots#6および#7はサンプルパッケージの実行と実行を示します期間。 11
分03
秒かかりました610
ミリ秒で、ルックアップ変換ベースのパッケージを実行します。次の警告メッセージが表示される場合があります。情報:The buffer manager has allocated nnnnn bytes, even though the memory pressure has been detected and repeated attempts to swap buffers have failed.
ここに link があります。これは、ルックアップキャッシュの計算方法について説明しています。サイズ。このパッケージの実行中、データフロータスクがより速く完了したにもかかわらず、パイプラインのクリーンアップには多くの時間がかかりました。
このdoes n'tは、参照変換が悪いことを意味します。それは賢明に使用する必要があるということです。私は自分のプロジェクトで非常に頻繁にそれを使用していますが、繰り返しますが、毎日の検索で1,000万行以上を処理していません。通常、私のジョブは200万から300万行を処理します。そのため、パフォーマンスは本当に優れています。最大1,000万行、どちらも同様に良好に機能しました。私が気づいたほとんどの場合、ボトルネックは変換ではなく宛先コンポーネントであることがわかりました。複数の宛先を設定することで、これを克服できます。 Here は、複数の宛先の実装を示す例です。
スクリーンショット#8は、3つのテーブルすべてのレコード数を示しています。スクリーンショット#9は、各テーブルの上位6レコードを示しています。
お役に立てば幸いです。
SQLスクリプト:
CREATE TABLE [dbo].[ItemAmount](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ItemNumber] [nvarchar](30) NOT NULL,
[Price] [numeric](18, 2) NOT NULL,
[Discount] [numeric](18, 2) NOT NULL,
[CalculatedAmount] [numeric](18, 2) NOT NULL,
CONSTRAINT [PK_ItemAmount] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO
CREATE TABLE [dbo].[ItemDiscountInfo](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ItemNumber] [nvarchar](30) NOT NULL,
[Discount] [numeric](18, 2) NOT NULL,
CONSTRAINT [PK_ItemDiscountInfo] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO
CREATE TABLE [dbo].[ItemPriceInfo](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ItemNumber] [nvarchar](30) NOT NULL,
[Price] [numeric](18, 2) NOT NULL,
CONSTRAINT [PK_ItemPriceInfo] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO
スクリーンショット#1:
スクリーンショット#2:
スクリーンショット#3:
スクリーンショット#4:
スクリーンショット#5:
スクリーンショット#6:
スクリーンショット#7:
スクリーンショット#8:
スクリーンショット#9:
結合結合は、SQLでJOINが機能する方法と同様の結果を生成するように設計されています。 Lookupコンポーネントは、SQL JOINのようには機能しません。結果が異なる場合の例を次に示します。
入力1(請求書など)と入力2(請求書明細など)の間に1対多の関係がある場合、これら2つの入力の結合の結果に1つの請求書の1つ以上の行を含める必要があります。 。
結合結合を使用すると、目的の出力が得られます。入力2がルックアップソースであるルックアップでは、入力2に存在する行数に関係なく、出力は請求書ごとに1行になります。データが入力2からどの行に来るか思い出せませんが、少なくとも、重複データの警告が表示されることを確認してください。
そのため、各コンポーネントにはSSISでの独自の役割があります。
検討すべき3番目の代替案を提案します。あなたのOLE DBSourceはテーブルではなくクエリを含むことができ、そこで結合を行うことができます。これはすべての状況で良いわけではありません。 。
2つの違いがあります。
並べ替え:
データベースクエリの負荷:
これは、ソートされたリストを作成する労力がなく、約1%を超える行が必要な場合(単一の行を選択すると、ストリーミング時に同じ行のコストの約100倍になります)(ソートしたくない場合)メモリ内に1000万行のテーブル..)その後、マージ結合が進むべき方法です。
少数の一致(キャッシュが有効になっている場合に異なる値が検索された)のみが予想される場合は、ルックアップの方が優れています。
私にとって、この2つの間のトレードオフは、1万行から1万行の間で調べる必要があります。
より速いものは依存します
ルックアップは、マージ結合コンポーネントの左結合に似ています。 Mergeは他の種類の結合を行うことができますが、これが望むのであれば、違いは主にパフォーマンスと利便性にあります。
ルックアップするデータの相対的な量(ルックアップコンポーネントへの入力)と参照されるデータの量(ルックアップキャッシュまたはルックアップデータソースのサイズ)によって、パフォーマンス特性は大きく異なります。
例えば。 10行のみを検索する必要があるが、参照されるデータセットが1,000万行である場合-部分キャッシュモードまたは非キャッシュモードを使用した検索は、1,000万行ではなく10レコードのみを取得するため、高速になります。 1000万行をルックアップする必要があり、参照されるデータセットが10行である場合、完全にキャッシュされたルックアップはおそらくより高速です(1000万行が既にソートされており、マージ結合を試すことができる場合を除く)。両方のデータセットが大きい場合(特に使用可能なRAMを超える場合)、または大きい方のデータセットが並べ替えられている場合、Mergeの方が適している可能性があります。
これは古い質問ですが、与えられた答えでカバーされなかったと感じる重要な点の1つは、マージ結合が2つのデータフローをマージするため、任意のソースからのデータを結合できることです。一方、ルックアップでは、1つのデータソースをOLE DB。
結合の結合では、1つ以上の基準に基づいて複数の列に結合できますが、ルックアップは、一致する列情報に基づいて1つ以上の値のみを取得するという点でより制限されています-ルックアップクエリはそれぞれに対して実行されますデータソースの値(SSISは可能であればデータソースをキャッシュします)。
それは、2つのデータソースの内容と、マージ後の最終的なソースの表示方法に大きく依存します。 DTSパッケージのスキーマに関する詳細を教えてください。
考慮すべきもう1つのことは、パフォーマンスです。誤って使用すると、それぞれが他より遅くなる可能性がありますが、やはり、所有するデータの量とデータソーススキーマに依存します。