sql >> データベース >  >> RDS >> Sqlserver

SSISのマージ結合変換とルックアップ変換の違いは何ですか?

    スクリーンショット# 1 Merge Join transformationを区別するためのいくつかのポイントを示しています およびLookup transformation

    ルックアップについて:

    ソース1の入力に基づいてソース2で一致する行を検索し、すべての入力行に一致する行が1つしかないことがわかっている場合は、ルックアップ操作を使用することをお勧めします。例として、OrderDetailsがあります。 テーブルで、一致するOrder Idを検索する およびCustomer Number 、その後、ルックアップがより良いオプションです。

    マージ参加について:

    Addressからすべてのアドレス(自宅、職場、その他)を取得するなどの結合を実行する場合 Customer内の特定の顧客のテーブル テーブルの場合、顧客は1つ以上のアドレスを関連付けることができるため、MergeJoinを使用する必要があります。

    比較する例:

    これは、Merge Join間のパフォーマンスの違いを示すシナリオです。 およびLookup 。ここで使用されるデータは1対1の結合であり、比較するためにそれらの間で共通する唯一のシナリオです。

    1. dbo.ItemPriceInfoという名前のテーブルが3つあります 、dbo.ItemDiscountInfo およびdbo.ItemAmount 。これらのテーブルのスクリプトの作成は、SQLスクリプトセクションにあります。

    2. テーブルdbo.ItemPriceInfo およびdbo.ItemDiscountInfo どちらも13,349,729行あります。両方のテーブルには、共通の列としてItemNumberがあります。 ItemPriceInfoには価格情報があり、ItemDiscountInfoには割引情報があります。スクリーンショット# 2 は、これらの各テーブルの行数を示しています。スクリーンショット# 3 は、テーブルに存在するデータについてのアイデアを与えるために上位6行を示しています。

    3. マージ結合変換とルックアップ変換のパフォーマンスを比較するために、2つのSSISパッケージを作成しました。どちらのパッケージも、テーブルdbo.ItemPriceInfoから情報を取得する必要があります およびdbo.ItemDiscountInfo 、合計金額を計算して、テーブルdbo.ItemAmountに保存します 。

    4. 最初に使用されたパッケージMerge Join 変換とその中で、データを結合するためにINNERJOINを使用しました。スクリーンショット# 4 および# 5 サンプルパッケージの実行と実行期間を表示します。 05かかりました 14 719 マージ結合トランスフォーメーションベースのパッケージを実行するためのミリ秒。

    5. 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. こちらがリンクです ルックアップキャッシュサイズを計算する方法について説明しています。このパッケージの実行中、データフロータスクはより速く完了しましたが、パイプラインのクリーンアップには多くの時間がかかりました。

    6. これはありません ルックアップ変換が悪いことを意味します。それは賢く使われなければならないということだけです。私はこれをプロジェクトで頻繁に使用しますが、毎日1,000万行以上のルックアップを処理することはありません。通常、私の仕事は200万から300万行を処理しますが、そのためのパフォーマンスは非常に優れています。最大1,000万行、どちらも同等のパフォーマンスを示しました。ほとんどの場合、私が気付いたのは、ボトルネックが変換ではなく宛先コンポーネントであることが判明したことです。複数の宛先を持つことでそれを克服できます。 ここ 複数の宛先の実装を示す例です。

    7. スクリーンショット# 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:



    1. Oracleで主キー列を取得するにはどうすればよいですか?

    2. レコードが変更されたときに自動的に更新されるSQLServerの日時列が必要です

    3. SQLを使用してテキストフィールドの単語数の統計を決定する

    4. MySQLを使用して外部キーを使用してテーブルに値を挿入するにはどうすればよいですか?