スクリーンショット# 1 Merge Join transformation
を区別するためのいくつかのポイントを示しています およびLookup transformation
。
ルックアップについて:
ソース1の入力に基づいてソース2で一致する行を検索し、すべての入力行に一致する行が1つしかないことがわかっている場合は、ルックアップ操作を使用することをお勧めします。例として、OrderDetails
があります。 テーブルで、一致するOrder Id
を検索する およびCustomer Number
、その後、ルックアップがより良いオプションです。
マージ参加について:
Address
からすべてのアドレス(自宅、職場、その他)を取得するなどの結合を実行する場合 Customer
内の特定の顧客のテーブル テーブルの場合、顧客は1つ以上のアドレスを関連付けることができるため、MergeJoinを使用する必要があります。
比較する例:
これは、Merge Join
間のパフォーマンスの違いを示すシナリオです。 およびLookup
。ここで使用されるデータは1対1の結合であり、比較するためにそれらの間で共通する唯一のシナリオです。
-
dbo.ItemPriceInfo
という名前のテーブルが3つあります 、dbo.ItemDiscountInfo
およびdbo.ItemAmount
。これらのテーブルのスクリプトの作成は、SQLスクリプトセクションにあります。 -
テーブル
dbo.ItemPriceInfo
およびdbo.ItemDiscountInfo
どちらも13,349,729行あります。両方のテーブルには、共通の列としてItemNumberがあります。 ItemPriceInfoには価格情報があり、ItemDiscountInfoには割引情報があります。スクリーンショット# 2 は、これらの各テーブルの行数を示しています。スクリーンショット# 3 は、テーブルに存在するデータについてのアイデアを与えるために上位6行を示しています。 -
マージ結合変換とルックアップ変換のパフォーマンスを比較するために、2つのSSISパッケージを作成しました。どちらのパッケージも、テーブル
dbo.ItemPriceInfo
から情報を取得する必要があります およびdbo.ItemDiscountInfo
、合計金額を計算して、テーブルdbo.ItemAmount
に保存します 。 -
最初に使用されたパッケージ
Merge Join
変換とその中で、データを結合するためにINNERJOINを使用しました。スクリーンショット# 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.
こちらがリンクです ルックアップキャッシュサイズを計算する方法について説明しています。このパッケージの実行中、データフロータスクはより速く完了しましたが、パイプラインのクリーンアップには多くの時間がかかりました。 -
これはありません ルックアップ変換が悪いことを意味します。それは賢く使われなければならないということだけです。私はこれをプロジェクトで頻繁に使用しますが、毎日1,000万行以上のルックアップを処理することはありません。通常、私の仕事は200万から300万行を処理しますが、そのためのパフォーマンスは非常に優れています。最大1,000万行、どちらも同等のパフォーマンスを示しました。ほとんどの場合、私が気付いたのは、ボトルネックが変換ではなく宛先コンポーネントであることが判明したことです。複数の宛先を持つことでそれを克服できます。 ここ 複数の宛先の実装を示す例です。
-
スクリーンショット# 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: