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

SSISの増分負荷

    人々はこれまで以上に急いでいます。彼らは今すぐデータを求めています。さらに、データはますます大きくなっています。したがって、古き良きテクニックは「十分に優れている」ため、使用できません。それは速くなければなりません。また、ETLステップも例外ではありません。ここで、増分負荷が発生します。また、このページを表示している場合は、おそらくSSISの増分負荷を探しています。

    そして、それがこの記事の焦点です。比較と例を使用して、SSISでの増分データロードを段階的に説明します。そして、これを理解するのに頭がおかしくなることはありませんのでご安心ください。

    これがあなたのために用意されているものです:

    • ETLの全負荷と増分負荷とは何ですか?
    • SSISの増分データロードとは何ですか?
    • SSISの全負荷と増分負荷の違い
    • CDCまたはChangeDataCaptureを使用したSSISの増分負荷
    • DateTime列を使用したSSISの増分負荷
    • ルックアップを使用してSSISで増分ロードを実行する方法
    • SSISデータの読み込みに最適なツール

    各セクションにはサブセクションがあります。リンクをクリックすると、必要なトピックにジャンプできます。

    例を始める前に、増分負荷とその反対の全負荷を比較してみましょう。

    ETLの全負荷と増分負荷とは

    使用するETLツールに関係なく、フルロードとインクリメンタルロードは同じ意味を持ちます。以下に説明しましょう。

    ETLのフルロード

    名前が示すように、ETLのフルロードは、すべてのデータをソースから宛先にロードしています。ソースからすべてをロードする前に、ターゲットテーブルが切り捨てられます。そのため、この手法は破壊的負荷とも呼ばれます。 。この手法も簡単です。また、これにより、最高のデータ整合性が保証されます。しかし、今日のデータのサイズは昨日よりも大きくなっています。したがって、増え続けるデータでこれを使用すると、時間の経過とともにプロセスが遅くなります。

    ETL全負荷のユースケース

    • ソースデータのサイズは小さく、今後何年にもわたって大幅に増加することはありません。例としては、色のリスト、いくつかのカテゴリ/分類、国や都市のリストなどがあります。
    • ソースでどちらが新しいか変更されているかを判断するのは難しいです。
    • データはソースから宛先まで完全に同じである必要があります
    • データの履歴は無関係であり、より頻繁に上書きされます

    ETLの増分負荷

    一方、インクリメンタルロードも名前が示すとおりです。変更されたデータのみがソースから宛先にロードされます。これは、時間の経過とともに段階的に行われます。変更されなかったものはそのまま残ります。これを行うのは少し難しいです。すべての変更が収集され、宛先にロードされていることを確認する必要があります。ただし、これは非常に大きなデータではフルロードよりも高速に実行されます。

    ETLインクリメンタルロードのユースケース

    • データサイズが非常に大きく、大きな結果セットのクエリは非常に遅くなります
    • 変更は簡単に照会できます
    • 削除されたデータは、監査システムのように、宛先に保持する必要があります

    SSISの増分負荷とは

    SSISの増分負荷の基本的な構成要素を図1に示します。

    SSISでの増分読み込みは、要件に応じてより複雑になる傾向があります。ただし、図1の単純な「レシピカード」には、データを段階的に「調理」するために必要なものが含まれています。データの変更をキャプチャすることは難しい部分です。注意しないと目的地を台無しにする可能性があります。

    以降のセクションでは、例を使用してSSISで増分ロードを実行する方法を説明します。これらには、ChangeData Capture(CDC)、DateTime列、およびルックアップの使用が含まれます。 DevartSSISコンポーネントを使用してこれがどのように行われるかもわかります。

    次のセクションで、SSISの増分負荷と全負荷を比較してみましょう。

    SSISの全負荷と増分負荷の違い

    SSISで増分負荷がどのように見えるかはすでに見てきました(図1)。一方、下の図2のSSIS全負荷での状況は次のとおりです。

    SSISの全負荷と増分負荷の違いは、パッケージの設計にあります。フルロード設計では、SSISパッケージにドラッグするコンポーネントが少なくて済みます。とてもシンプルで、ほとんど何も考えていません。そのため、生産性の誤った感覚から、一部の開発者はほとんどの場合この手法に頼る傾向があります。

    ただし、15TBなどの大容量データの場合、毎晩フルロード設計パッケージを実行することはお勧めできません。ユーザーが朝に到着する前に時間どおりに終了すると思いますか?まったく変更されていないレコードを再挿入しようとしているため、これは発生しません。それがデータの約70%である場合、サーバーリソースによっては、より多くのダウンタイムが必要になります。

    それは受け入れられません。

    したがって、これらのシナリオでインクリメンタルロードを使用する必要があります。次のセクションでは、増分ロードを使用してデータをより高速にロードする方法を学習します。

    CDCを使用した増分負荷inSSIS

    まず、Change Data Capture(CDC)の使用を検討しましょう。ここから次の3つの例まで、簡単な例を使用することに注意してください。したがって、パッケージの設計によって目的が曖昧になることはありません。

    例を始める前に、このセクションでは以下について説明します。

    • まず、データベースとテーブルでCDCを有効にする方法
    • 次に、CDCを使用してSSIS増分ロード用のSSISパッケージを作成します
    • 最後に、実行して結果を確認します

    図3は、この例の構成要素を示しています。

    Change Data Capture(CDC)は、テーブルの挿入、削除、および更新を記録します。この例を機能させる前に、CDC用に構成されたデータベースとテーブルが必要です。

    データベースとテーブルでCDCを有効にする方法

    データベースとテーブルの設定は、デフォルトでCDCなしになっています。データベースをCDC対応にするために、T-SQL構文を次に示します。

    -- point to the database you need to CDC-enable
    USE SportsCarSales
    GO
    
    -- this will enable CDC to the current database.
    EXEC sys.sp_cdc_enable_db
    GO

    次に、CDCが実際に有効になっているかどうかを確認するには、次のコマンドを実行します。

    select name from sys.databases
    where is_cdc_enabled=1

    CDCに対して有効にしたデータベースの名前が表示されたら、準備は完了です。これで、データベースでCDCが有効になりました。

    しかし、それはここで終わりではありません。変更について追跡するテーブルを指定する必要があります。 sp_cdc_enable_table トリックを行います。以下はその一例です。

    EXEC sys.sp_cdc_enable_table
    @source_schema = N'dbo',
    @source_name   = N'sportsCarSales',
    @role_name     = NULL,
    @supports_net_changes = 1
    GO

    上記のコードを実行すると、以下のようなメッセージが表示されます。

    Job 'cdc.SportsCarSales_capture' started successfully.
    Job 'cdc.SportsCarSales_cleanup' started successfully.

    これらのメッセージは、CDCのテーブルを有効にした後に作成された2つの新しいSQLServerエージェントジョブです。そのため、CDCを機能させるにはSQLServerエージェントが必要です。図4のスクリーンショットを参照してください。

    sportsCarSales で挿入、削除、更新を行う tableは、 cdc.dbo_sportsCarSales_CTという名前の別のテーブルへの変更を自動的に記録します。 。このテーブルには、元のテーブルと同様の列があります。図5のスクリーンショットを参照してください。

    _ $ operation 左の表の列は特に重要です。この列に指定できる値は、1(削除)、2(挿入)、3、および4(更新)です。更新では2つの値が使用されます。1つはの列値用です。 アップデート(それは3です)。もう1つは、の列値です。 アップデート(それは4です)。 SSISパッケージを実行する前に値を確認するときに、この列を確認できます。 CDCSource およびCDCスプリッター コンポーネントは、変更を識別するときにこのテーブルを使用します。これらについては、次のセクションで詳しく説明します。

    CDCを使用したSSISインクリメンタルロード用のSSISパッケージの作成

    CDCを使用して増分ロードでSSISパッケージを作成する手順は次のとおりです。これは、Visual Studio 2019にすでに空白のパッケージがあることを前提としています。ここでの目標は、 sportsCarSalesから行を読み込むことです。 FactSportsCarSalesへのテーブル データウェアハウスのファクトテーブル。

    手順の概要は次のとおりです。

    ステップ1。 2つのデータベース接続マネージャーを作成する
    ステップ2。 2CDC制御タスクを制御フローにドラッグします
    ステップ3。データフロータスクをドラッグして、CDC制御タスクに接続します

    ステップ#1。 2つのデータベース接続マネージャーを作成する

    ここでは2つのデータベース接続が必要です。 1つは、CDC対応データベースを指すADO.Net接続です。次に、宛先としてデータウェアハウスへのOLEDB接続を作成します。どちらもSQLServer2019データベースです。それに応じて図6および7を参照してください。この例では、両方のデータベースが同じマシン上にあります。そして、接続にはWindows認証を使用しています。

    したがって、接続マネージャー ウィンドウで右クリックし、新しいADO.Net接続を選択します。 。次に、下の図6に示すように、サーバー、認証、およびデータベースの設定を入力します。

    次に、データウェアハウスへのOLEDB接続を作成します。 [接続マネージャー]ウィンドウで、右クリックして[新しいOLEDB接続]を選択します。 。次に、サーバー、認証、およびデータベース名を入力します。ここでデータウェアハウスを指定します。

    ステップ#2。 2CDC制御タスクを制御フローにドラッグします

    制御フローでCDC制御タスクをドラッグした後に実行する必要がある2つのことがあります。

    CDC開始をマーク

    まず、CDC開始をマークするようにCDC制御タスクを構成する必要があります。次に、CDC状態テーブルを作成します。これは、1つの構成ウィンドウで実行できます。下の図8を参照してください。

    図9の番号付きの手順に従って、詳細を以下に示します。

    1. 図6で作成したADO.Net接続を選択します。
    2. 次に、[CDC開始のマーク]を選択します 。
    3. 新規をクリックします CDC状態変数を作成します。次に、ウィンドウが表示されます。 OKをクリックします デフォルトの変数名を作成するにはUser::CDC_State
    4. ADO.Net接続を選択して、CDCの状態をそのデータベースに保存できるようにします。
    5. 新規をクリックします 状態を保存するためのテーブルを作成します。スクリプトはすでに作成されています。したがって、実行をクリックするだけです 次のウィンドウで。
    6. 次に、 CDC_Stateを選択します 州名として。
    7. 最後に、[ OK]をクリックします 。

    このCDC制御タスクを構成した後、パッケージを実行します。他のデータベースにコピーされたレコードはまだ表示されません。ただし、状態テーブル( dbo.cdc_state )初期値が入力されます。

    ここから、このCDC制御タスクを無効にするか、次のタスクで新しい値で再度上書きするかを選択できます。

    処理範囲の取得

    新しいCDC制御タスクを制御フローにドラッグするか、前のタスクを上書きします。構成は、CDC制御操作(#2)を除いて、図9と同じです。今回は、処理範囲を取得を選択します 。次に、[ OK]をクリックします 。これを、後のステップ3のデータフロータスクに接続します。

    処理範囲をマーク

    最初のタスクと同様に他のCDC制御タスクを構成しますが、今回は処理範囲のマークを選択します。 CDC制御操作用。ステップ3のデータフロータスクをこれに接続します。

    ステップ#3。データフロータスクをドラッグして、CDCControlタスクに接続します

    このデータフロータスクは、前の図3に示すように、抽出と読み込みを行います。各ステップの詳細に入る前に、ここに要約があります:

    A.CDCソースを追加する
    B. CDCスプリッターを追加し、CDCソースに接続します
    C.OLEDBコマンドを追加してレコードを削除します
    D.レコードを挿入するOLEDB変換先を追加する
    E.レコードを更新するために別のOLEDBコマンドを追加します

    それでは、飛び込みましょう。

    A。 CDCソースを追加する

    CDCソースをドラッグします 以下の図9に示す設定のコンポーネント。

    図9の番号付きの手順に従って、詳細を以下に示します。

    1. まず、図6で作成したADO.Net接続を選択します。
    2. 次に、CDC対応のテーブル sportsCarSalesを選択します。 。
    3. キャプチャインスタンスを選択しますdbo_SportsCarSales
    4. 次に、ネットを選択します CDC処理モードの場合。これにより、正味の変更のみが返されます。各処理モードの詳細については、このリンクを確認してください。 プレビューをクリックすることもできます 含まれる行を確認します。
    5. 前に作成したCDC状態変数を選択します(図9)。
    6. 最後に、[ OK]をクリックします 。
    B。 CDCスプリッターを追加し、CDCソースに接続します

    CDCスプリッターの唯一の要件 CDCソースです その前に。したがって、CDCソースを接続します このコンポーネントの前に。これにより、挿入、更新、削除への変更が分離されます。

    C。レコードを削除するOLEDBコマンドを追加する

    まず、このコンポーネントにDelete Recordsというラベルを付ける必要があります(図3を参照)。次に、これをCDCスプリッターに接続します。プロンプトが表示されたら、 DeleteOutputを選択します 出力については、 OKをクリックします 。

    次に、OLEDBコマンドの接続マネージャーを構成します タブ。図10を参照してください。

    次に、コンポーネントのプロパティ タブで、 SQLCommandのDELETEコマンドを指定します 財産。コマンドは次のようになります:

    DELETE FROM FactSportsCarSales
    WHERE SalesID = ?

    下の図11のスクリーンショットを参照してください。

    疑問符は、 SalesIDのパラメータを作成します 。各SalesID CDCSplitterからの値 FactSportsCarSalesの行を削除するために使用されます テーブル。

    次に、列のマッピング タブで、 SalesIDをマッピングします テーブルの列をパラメータ( Param_0 )図12を参照してください。

    最後に、[OK]をクリックします。

    D。レコードを挿入するOLEDB変換先を追加する

    まず、OLEDBの宛先をドラッグします 。次に、レコードの挿入というラベルを付けます 。これをCDCスプリッターに接続します 。次に、 InsertOutput を選択します ウィンドウプロンプトが表示されたとき。基本設定については、図14を参照してください。

    図13の番号付きの手順に従って、詳細を以下に示します。

    1. まず、図7で作成したOLEDB接続を選択します。
      次に、 FactSportsCarSalesを選択します ファクトテーブル。
    2. 最後に、[ OK]をクリックします 。
    E.レコードを更新するためのOLEDBコマンドを追加する

    別のOLEDBコマンドをドラッグします レコードの更新というラベルを付けます。 次に、それをCDCスプリッターに接続します 。 UpdateOutputが自動的に選択されます 出力。 接続マネージャー タブ設定は図11と同じである必要があります。

    ただし、 Component PropertiesSQLCommand 次のような値にする必要があります:

    UPDATE [dbo].[FactSportsCarSales]
       SET [ClientID] = ?
          ,[SportsCarID] = ?
          ,[PurchaseDate] = ?
          ,[Quantity] = ?
          ,[UnitPrice] = ?
     WHERE [SalesID]= ?

    上記のコードの疑問符の数は、 Param_0から開始して使用するパラメーターの数を示しています。 。Param_0からのパラメータの位置 Param_5へ コード内の位置に基づいて配置されます。つまり、 Param_0 isfor ClientID Param_1 SportsCarID用です 、など。

    列マッピングを確認してください 図15で

    データベースおよびテーブルレベルでCDCを構成した後、CDCが機能するかどうかをテストする方法は、行を追加および変更することです。それでは、テーブルにいくつかのレコードを追加しましょう。

    
    USE SportsCarSales
    GO
    
    INSERT INTO SportsCarSales (ClientID, SportsCarID, PurchaseDate, Quantity, UnitPrice)
    	VALUES (1, 1920, '02/03/2022', 1, 845000.0000),
    	(5, 1920, '01/22/2022', 1, 845000.0000),
    		(54, 1920, '01/15/2022', 1, 845000.0000),
    		(62, 1920, '02/04/2022', 1, 845000.0000);
    GO

    これがCDCに記録されているかどうかを確認するには、 cdc.dbo_sportsCarSales_CTにクエリを実行します。 テーブル。

    SELECT * FROM cdc.dbo_sportsCarSales_CT;

    図15のINSERTコマンド後の変更データキャプチャの結果を確認してください。

    それで、それは挿入を記録しました。いいですね。

    ここで、先にSSISパッケージを実行してみてください。結果は下の図16と同じになるはずです。

    図16 。 CDCを使用した増分ロードのSSISパッケージランタイム結果。

    最後に、 FactSportsCarSalesで結果をクエリします 表には、同じ4つのレコードのセットが表示されます。

    DateTime列を使用したSSISの増分負荷

    DateTimecolumnsを使用したSSISの増分ロードは、データを増分で収集するもう1つの方法です。 CDCなしでETLinaテーブルを実行する場合、これが次のオプションです。

    ソーステーブルには変更済みが含まれている場合があります またはLastUpdate 図17のような列。

    変更を照会するには、最大の変更済みを知る必要があります。 宛先からの列値。次に、 Modifiedより大きいソースからのすべてのレコードをクエリします 宛先からのcolumnvalue。

    この手法の典型的な要素を図18に示します。

    このタイプの増分負荷を調理する方法の指示に従ってください。このセクションのサブトピックは次のとおりです。

    • DateTime列を使用してSSIS増分ロードを実行するパッケージを作成する
    • パッケージの実行時の結果

    DateTime列を使用してSSISインクリメンタルロードを実行するパッケージを作成する

    私たちの目的は、 SportsCarsをロードすることです dimSportsCarsへのテーブル 別のデータベースのディメンションテーブル。手順の概要は次のとおりです。

    ステップ1。 2つのOLEDB接続マネージャーを作成する
    ステップ2。 2つのパッケージ変数を作成します
    ステップ3。 SQLタスクの実行を追加します 制御フローで
    ステップ4。 データフロータスクを追加します

    始めましょう。

    ステップ#1。 2つのOLEDB接続マネージャーを作成する

    最初のOLEDB接続は、トランザクションデータベースからのものです。また、設定は図19に示すように簡単です。

    次に、データウェアハウスへの別のOLEDB接続を作成します。これは、図7と同じである必要があります。

    ステップ#2。 2つのパッケージ変数を作成する

    最初の変数は、 dimSportsCarsからの最終変更日を保持します 寸法表。次に、2番目はカスタムSQLクエリを保持します。

    A。 User::sportsCars_lastUpdate変数を作成します
    1. 変数 ウィンドウで、変数の追加をクリックします 。
    2. 名前をsportsCars_lastupdate
    3. データ型をDateTimeに設定します 。
    B。 User::sqlCommand変数を作成します
    1. 変数 ウィンドウで、変数の追加をクリックします 。
    2. 名前をsqlCommand
    3. タイプを文字列に設定します 。
    4. 省略記号ボタンをクリックして、を作成します 。 Expression Builder については、図21を参照してください。 ウィンドウと実際の文字列式。
    5. [ OK]をクリックします 。

    SQL文字列は次のようになります。

    "SELECT  SportsCarID, StyleID, ManufacturerID, Model, UnitPrice, created, modified 
    FROM sportsCars
    WHERE modified > '" + (DT_WSTR, 50) @[User::sportsCars_lastupdate]  + "' 
    ORDER BY SportsCarID;"

    WHERE句をModifiedに設定していることに注意してください User ::sportsCars_lastupdateより大きい 。

    以降の手順で2つの変数を設定する方法について詳しく説明します。

    ステップ#3。制御フローにSQL実行タスクを追加する

    このタスクは、宛先テーブルを照会して、最後の変更済みを取得します。 日付値。 SQLタスクの実行をドラッグします 制御フローへ。次に、DWから最終更新日を取得というラベルを付けます。 。次に、図21の設定を参照してください。

    ここで設定する重要なプロパティは、接続です。 、 SQLStatement 、および ResultSet プロパティ。

    接続を設定します STEP#1で設定された2番目のOLEDB接続へのプロパティ。次に、 SQLStatementを設定します 以下のコードのプロパティ。

    select max(modified) as LastUpdate from dimSportsCars

    次に、 ResultSetを設定します 単一行へのプロパティ 。

    最後に、 LastUpdateをマッピングする必要があります User ::sportsCars_lastupdate への列エイリアス(上記のコードを参照) 変数。図22のスクリーンショットを参照してください。

    最後に、[ OK]をクリックします 新しい設定を保存します。

    ステップ#4。データフロータスクを追加する

    データフロータスクをドラッグします 制御フローに接続し、SQLタスクの実行に接続します それに。次に、データフロータスクにラベルを付けます dimSportsCarsディメンションを更新する 。次に、手順に従って、データフロータスクにコンポーネントを追加します。 。

    データフロータスク その中にいくつかのステップがあります:

    A.OLEDBソースを追加します
    B.ルックアップトランスフォーメーションを追加して、ソースと宛先を比較します
    C.レコードを更新するためのOLEDBコマンドを追加する
    D.レコードを挿入するOLEDB変換先を追加する

    それでは始めましょう。

    A.OLEDBソースを追加する

    このOLEDBソース 変更されたレコードのソーステーブルを照会します。図23の設定を参照してください。

    図23の番号に続いて、詳細は次のとおりです。

    1. 最初に、作成したOLEDB接続を指定します。図20を参照してください。
    2. 次に、データアクセスモードを設定します からSQLコマンドへ 変数
    3. 次に、前に作成した変数User::sqlCommandを選択します。図21を参照してください。
    4. 最後に、[ OK]をクリックします 。
    B。ルックアップトランスフォーメーションを追加して、ソースと宛先を比較します

    ここで、ソーステーブルと宛先テーブルを比較する方法が必要です。 ルックアップを使用できます それを行うためのTransformationcomponent。これにより、2つのテーブル間の結合が実行されます。

    したがって、ルックアップをドラッグします データフローの変換と名前を変更の分類 。次に、それをOLEDBソースに接続します ついさっき。ダブルクリックします。 一般の設定については、図24を参照してください。 ページ。

    ドロップダウンを行を一致出力なしにリダイレクトに設定します 図24に示すように、これは、一致しない行を使用することを意味します。この場合、これは送信元には存在するが宛先には存在しない行を検出するためのものです。

    次に、接続をクリックします ルックアップトランスフォーメーションエディタの左側のペインのページ 。次に、何を設定するかについて図25を参照してください。

    図26では、ターゲットテーブルのOLEDB接続を指定する必要があります。 (図7を参照)。次に、SQLクエリを以下のコードに設定します。

    SELECT SportsCarID from dimSportsCars

    SportsCarIDのみが必要です 列を比較するため、テーブル全体ではなくクエリを使用しました。

    次に、をクリックします ソースクエリキー列の宛先へのマッピングを設定するページ。マッピングについては、図26を参照してください。

    図26に示すように、 SportsCarID を使用して、送信元から宛先までの行が必要です。 キー列。両方のキー列が比較に使用されます。

    最後に、[ OK]をクリックします 。

    C。レコードを更新するためのOLEDBコマンドを追加する

    この部分では、 SportsCarIDと一致するレコードが更新されます。 ルックアップからのキー値 変革。

    したがって、OLEDBコマンドをドラッグします データフローで名前を付け、dimSportsCarsを更新します。 。次に、それをルックアップに接続します 以前の変換。プロンプトが表示されたら、出力を設定します ルックアップマッチ出力へ 。次に、[ OK]をクリックします 。

    OLEDBコマンドをダブルクリックします 接続マネージャーでプロパティを設定します タブ。図27を参照してください。

    図27は、接続マネージャーを設定する必要があることを示しています。 ターゲットデータベースに移動します(図8を参照)。次に、コンポーネントのプロパティをクリックします タブ。プロパティ設定については、図28を参照してください。

    SQLCommandプロパティは次のように設定されます:

    UPDATE dimSportsCars
    SET StyleID = ?, ManufacturerID = ? , MODEL = ? , UnitPrice = ? , modified = ?
    WHERE SportsCarID = ?

    私たちはすでに以前に同様のことをしました。質問マークはパラメータのプレースホルダーです。そして、正しいソース列をマップすると、対応するターゲット列が設定されます。図29のマッピングを参照してください。

    最後に、[ OK]をクリックします 。

    D。レコードを挿入するOLEDB変換先を追加する

    このパートでは、 SportsCarsで見つかった新しいレコードを挿入します dimSportsCarsへのテーブル 寸法表。

    したがって、OLEDBの宛先をドラッグします コンポーネントに名前を付け、dimSportsCarsに新しいレコードを挿入します。 それをダブルクリックして、接続とターゲットテーブルを設定します。図30を参照してください。

    図30に示すように、データウェアハウスへの接続を設定し(図8)、 dimSportsCarsを選択します。 寸法表。

    次に、マッピングをクリックします pagetoは、列がそれに応じてマップされているかどうかを確認します。列名はソースとターゲットの両方で同じであるため、自動的にマッピングされます。

    最後に、[ OK]をクリックします 。

    パッケージランタイムの結果

    パッケージが完成したので、これが図31の結果のスクリーンショットです。

    プロセスは8行を更新し、 dimSportsCarsに1つの新しい行を挿入しました 寸法表。

    ルックアップを使用したSSISの増分負荷

    インクリメンタルロードを実行する別の方法は、ターゲットからのソースを比較して、挿入、更新、および削除する必要があるものを確認することです。そして、これは、DateTime列とCDConの両方のテーブルがない場合のオプションです。これを行う1つの方法は、ルックアップを使用することです。 変革。

    このアプローチの典型的な要素を図32に示します。

    図32の単純なアプローチは、ハード削除を許可しないテーブルに適用できることに注意してください。削除を処理する必要がある場合は、完全結合を使用したマージ結合が適用される場合があります。

    このセクションには2つのサブトピックがあります:

    Lookupを使用してSSIS増分ロード用のSSISパッケージを作成する
    パッケージの実行時の結果

    飛び込みましょう。

    ルックアップを使用したSSISインクリメンタルロード用のSSISパッケージの作成

    ここでの目的は、メーカーの行を読み込むことです。 dimManufacturersへのテーブル 寸法表。

    これは、空のSSISパッケージの準備ができていることを前提としています。

    手順の概要は次のとおりです。

    ステップ1。 2つのOLEDB接続を作成する
    ステップ2。データフロータスクを追加する

    例から始めましょう。

    ステップ#1。 2つのOLEDB接続を作成する

    ソースについては図19を、ターゲットについては図7を参照してください。ここでは同じ接続マネージャーを使用しています。

    ステップ#2。データフロータスクを追加する

    データフロータスクをドラッグします 制御フローで、製造元ディメンションテーブルの更新という名前を付けます。 それをダブルクリックして、次の手順に従います。以下に要約するのは、データフロータスク内の手順です。 。

    A. OLEDBソースを追加します
    B.ルックアップを追加します 新しいレコードをスキャンするための変換
    C. OLEDB宛先を追加します レコードを挿入します。
    D.別のルックアップを追加する 変更をスキャンするための変換
    E. OLEDBコマンドを追加します ターゲットテーブルを更新するには

    A。 OLEDBソースを追加する

    OLEDBソースをドラッグします メーカーというラベルを付けます 。 接続マネージャーを設定します 図33に示すように。

    B。新しいレコードをスキャンするためのルックアップ変換を追加する

    このルックアップ トランスフォーメーションは、 ManufacturerID に基づいて、ターゲットに存在しないレコードをスキャンします キーカラム。また、一致しない行はすべてテーブル挿入の候補です。

    ルックアップをドラッグします 変換して、LookupdimManufacturersという名前を付けます。 次に、それをダブルクリックします。

    一般の設定 ページは図24と同じである必要があります。一方、データウェアハウスへの接続を設定し、接続のクエリを使用します。 ページ設定。図34を参照してください。

    C。レコードを挿入するOLEDB変換先を追加する

    OLEDBの宛先をドラッグします 新しいレコードを挿入という名前を付けます。 ルックアップに接続します 変換して、一致しない出力を検索を選択します プロンプトが表示されたとき。それをダブルクリックして、図35に示すように接続とターゲットテーブルを設定します。

    ソーステーブルとターゲットテーブルの列名は同じで、自動的にマップされます。図36を参照してください。

    最後に、[ OK]をクリックします 。

    D。変更をスキャンするために別のルックアップ変換を追加する

    以前のルックアップとは異なり 変換、これはメーカーの変更をスキャンします 桁。また、変更がある場合は、テーブルの更新の候補になります。

    別のルックアップをドラッグします 変換して、変更されたルックアップレコードという名前を付けます。 最初のルックアップに接続します 変身。 一般 このルックアップのページは、図24と同じである必要があります。

    一方、接続 ページは下の図37のようになります。

    一方、図38のマッピングに注目してください。

    図38は、 Manufacturerによるマッピングを示しています。 名前。等しくない場合は、ソースに変更があります。そして、それをターゲットにコピーする必要があります。

    E。 OLEDBコマンドを追加してターゲットテーブルを更新する

    設定は、 SQLCommand を除いて、図29と同じである必要があります。 。 UPDATEコマンドは次のようになります。

    UPDATE dimManufacturers
    set manufacturer = ?
    where manufacturerID = ?

    それに応じて、パラメータへの列マッピングを調整します。

    パッケージランタイムの結果

    終わり?次に、パッケージを実行します。図39と同じ実行時の結果が表示されます。

    SSISデータの読み込みに最適なツール

    以前に使用したすべての例では、Microsoftのすぐに使用できるコンポーネントを使用しています。一部のプロジェクトには十分ですが、SSISを介してクラウドソースとデータベースソースの両方を統合する必要がある場合はどうなりますか?

    ここで、DevartSSISコンポーネントが役立ちます。これらのSSISコンポーネントは使いやすいです。また、データソース固有の最適化と高度なキャッシュを使用して、高性能のデータ読み込みを提供します。また、MySQL、PostgreSQL、OracleなどのRDBMSのお気に入りを含む40以上のデータソースがあります。また、Salesforce、HubSpot、GoogleAnalyticsなどのクラウドサービスも含まれています。したがって、DevartSSISコンポーネントを使用してSSISに数百万のレコードをロードしてみる価値があります。

    なぜ例ではないのですか?

    DevartSSISコンポーネントを使用してインクリメンタルロードを実行する

    dimManufacturersを複製してみましょう テーブルをMySQLに入れ、Devartのルックアップを使用します および宛先 MySQLのコンポーネント。レシピを図40に示します。

    Visual StudioIntegrationServicesプロジェクトに新しいSSISパッケージを追加することから始めましょう。次に、データフロータスクを追加します それをダブルクリックします。次に、以下の手順に従います。

    その前に、手順の概要を示します。

    ステップ1。 OLEDBソースを追加します
    ステップ2。 Devart MySQL Connection Managerを追加します
    ステップ3。 DevartMySQLルックアップを追加します 新しいレコードをスキャンする
    ステップ4。別のDevartMySQLルックアップを追加します 変更をスキャンするための変換
    ステップ5。 DevartMySQL宛先を追加します レコードを挿入するには
    ステップ#6。 Add another Devart MySQL Destination to update records

    STEP #1. Add an OLE DB Source

    This will connect to the SQL Server database we had earlier. Please refer to Figure 8. Then, set the table to dimManufacturers

    STEP #2. Add a Devart MySQL Connection Manager

    We need this connection for the destination database and table. So, in the Connection Managers window, right-click and select New Connection 。 Then, select the DevartMySQL Connection Manager type. Then, configure the database access as shown in Figure 41. Notice the simpler interface to connect. Though you can go to the Advanced tab and see more properties there.

    I’m running MySQL 8 in my local machine and there’s a copy of the same database in SQL Server, but the rows are older.

    STEP #3. Add a Devart MySQL Lookup Transformation to Scanfor New Records

    Drag a Devart MySQL Lookup and name it Compare Source to Target 。 Then, connect it to the Devart MySQL Connection Manager ついさっき。 Now, follow the configuration in Figure 42.

    Following the numbers in Figure 42, the following are the details:

    1. First, select the Devart MySQL Connection Manager created in STEP #2.
    2. Then, select the dimmanufacturers table.
    3. In Lookup Columns , mark checked the ManufacturerID column.
    4. Then, in Input Columns , select ManufacturerID
    5. Then, select ManufacturerID in Reference Columns
    6. Finally, click OK

    :If you encounter a duplicate name error, go to Advanced Editor. And then, click Input and Output Properties 。 Rename either the Input or Output Column to a different name.

    STEP #4. Add another Devart MySQL Lookup Transformation toScan for Changes

    This second MySQL Lookup will scan forrecords that changed.

    Drag another Devart MySQL Lookup andlabel it Get Records that Changed. Connect it to thefirst Devart MySQL Lookup 。 Then, choose Lookup Match Output

    The setup is the same as in Figure 42. But choose the Manufacturer column instead of ManufacturerID 。 Do this for Lookup Columns , Input Columns , and Reference Columns

    STEP #5. Add a Devart MySQL Destination to Insert Records

    This step will insert records from thesource that have no match in the target.

    So, drag a Devart MySQL Destination and label it Insert New Records. Connect it to the first Devart MySQL Lookup 。 Double-click it and configure the Connection Manager 。 See Figure 43.

    In Figure 43, you need to set the connection to the MySQL connection manager we did in STEP #2. Then, click Component Properties 。 See the configuration in Figure 44.

    After setting the TableName to dimmanufacturers ,click Column Mappings 。 Since both the source and target tables havethe same column names, the columns are automatically mapped.

    Finally, click OK

    STEP #6. Add Another Devart MySQL Destination to UpdateRecords

    Unlike the other Devart MySQLDestination , this will update records that changed from the source.

    So, drag another Devart MySQL Destination and label it Update Existing. Connect it to the second Devart MySQL Lookup Transformation. And select Lookup No Match Output when a prompt appears. The setup is the same as in STEP #5 except for the Component Properties 。 See Figure 45 on what to change.

    Using the Devart MySQL Destination is dead easy than using an OLE DB Command. There’s no need to map parameters to columns. It also works for a Delete operation. This is unlike an OLE DB Destination that works for inserts only.

    Package Runtime Results

    See the runtime results in Figure 46.

    結論

    That’s it.

    You learned 3 ways to do incremental load in SSIS by using the following:

    • Change Data Capture
    • DateTime Columns
    • Lookup Transformation

    You also learned how to do it using DevartSSIS Components.

    Though our examples are simplified to makethe principle easier to understand as possible, there’s room for improvement.We didn’t use a staging table to store all changes, whether insert, update, ordelete. This is recommended for very large data, especially when the target isin another server. You can also add an executeprocess task in SSIS for special scenarios.

    Anyway, if you like this post, please shareit on your favorite social media platforms.


    1. Oracle11gまたは12cでテーブル/列/インデックス名のサイズを変更します

    2. エンティティフレームワークを介してintの配列をT-SQLストアドプロシージャに渡す

    3. SQLServerでテストデータを生成する方法

    4. PayPalODBCドライバー