8

私はDBAではありませんが、IT担当者として小さな会社で働いています。データベースをステージングから本番環境に複製する必要があります。これを行うためにSSISパッケージを作成しましたが、実行には数時間かかります。これも大規模なデータウェアハウスタイプのプロジェクトではなく、非常に単純Upsertです。私はそれをどのように設計したかという点で私が弱いリンクであると思います。

これが私の手順です:

  1. ステージングテーブルの切り捨て(EXECUTE SQL TASK
  2. 開発テーブルからステージングにデータをプルします(Data Flow Task
  3. データフロータスクを実行する
    1. OLE DB Source
    2. Conditional Split Transformation(使用条件[!]ISNULL(is_new_flag):)
    3. 新しい挿入の場合、既存の更新の場合

データフロータスクは、テーブル/値を変更するために数回模倣されますが、フローは同じです。OLE DBコンポーネントの更新が遅いことについていくつか読んだことがあり、いくつかのことを試しましたが、実行速度が非常に速くありませんでした。

他にどのような詳細を提供するかはわかりませんが、求められていることは何でも提供できます。

4

2 に答える 2

11

バッチ操作を使用して挿入または更新するSSIS2008R2を使用したサンプルパッケージ:

SSIS 2008 R2これは、バッチ操作を使用して2つのデータベース間で挿入、更新を実行する方法を示す、で記述されたサンプルパッケージです。

  • を使用すると、バッチ操作が実行されないOLE DB Commandため、パッケージの更新操作が遅くなります。すべての行は個別に更新されます。

Sourceこのサンプルでは、​​との2つのデータベースを使用していますDestination。私の例では、両方のデータベースがサーバー上にありますが、ロジックは、異なるサーバーと場所にあるデータベースに引き続き適用できます。

dbo.SourceTableソースデータベースに名前の付いたテーブルを作成しましたSource

CREATE TABLE [dbo].[SourceTable](
    [RowNumber] [bigint] NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
    [ModifiedOn] [datetime] NOT NULL,
    [IsActive] [bit] NULL
)

また、宛先データベースにdbo.DestinationTableとという名前の2つのテーブルを作成しました。dbo.StagingTableDestination

CREATE TABLE [dbo].[DestinationTable](
    [RowNumber] [bigint] NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
    [ModifiedOn] [datetime] NOT NULL
) 
GO

CREATE TABLE [dbo].[StagingTable](
    [RowNumber] [bigint] NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
    [ModifiedOn] [datetime] NOT NULL
) 
GO

dbo.SourceTable一意の値を持つ約140万行を列に挿入しましたRowNumber。テーブルdbo.DestinationTabledbo.StagingTableはそもそも空でした。テーブルのすべての行で、dbo.SourceTableフラグIsActiveがfalseに設定されています。

行数-1

Sourceそれぞれがデータベースに接続する2つのOLEDB接続マネージャーを使用してSSISパッケージを作成しましたDestination。以下に示すように制御フローを設計しました。

  • まず、宛先データベースに対してExecute SQL Taskステートメントを実行して、ステージングテーブルを切り捨てます。TRUNCATE TABLE dbo.StagingTable

  • 次のセクションでは、の構成方法について説明しData Flow Taskます。

  • 次に、で使用可能なデータを使用してデータExecute SQL Taskを更新する以下のSQLステートメントを実行します。これらの2つのテーブル間で一致する一意のキーがあると想定します。この場合、一意のキーは列です。dbo.DestinationTabledbo.StagingTableRowNumber

更新するスクリプト:

UPDATE      D 
SET         D.CreatedOn = S.CreatedOn
        ,   D.ModifiedOn = S.ModifiedOn 
FROM        dbo.DestinationTable D 
INNER JOIN  dbo.StagingTable S 
ON          D.RowNumber = S.RowNumber

制御フロー

以下に示すようにデータフロータスクを設計しました。

  • OLE DB Sourcedbo.SourceTableSQLコマンドを使用してデータを読み取りますSELECT RowNumber,CreatedOn, ModifiedOn FROM Source.dbo.SourceTable WHERE IsActive = 1

  • Lookup transformationRowNumber値がテーブルにすでに存在するかどうかを確認するために使用されますdbo.DestinationTable

  • レコードが存在しないOLE DB Destination場合は、名前付きにリダイレクトされInsert into destination table、行がに挿入されます。dbo.DestinationTable

  • レコードが存在するOLE DB Destination場合は、という名前のにリダイレクトされInsert into staging table、行がに挿入されdbo.StagingTableます。ステージングテーブルのこのデータは、2番目の`SQL実行タスクでバッチ更新を実行するために使用されます。

[データフロー]タブ

OLE DBソースの行をさらにいくつかアクティブ化するために、以下のクエリを実行していくつかのレコードをアクティブ化しました

UPDATE  dbo.SourceTable 
SET     IsActive = 1 
WHERE   (RowNumber % 9 = 1) 
OR      (RowNumber % 9 = 2)

行を更新-1

パッケージの最初の実行は次のようになりました。空だったため、すべての行が宛先テーブルに転送されました。私のマシンでのパッケージの実行には約がかかりました3 seconds

実行1

実行時間1

行数クエリを再度実行して、3つのテーブルすべての行数を見つけました。

行数-2

OLE DBソースの行をさらにいくつかアクティブ化するために、以下のクエリを実行していくつかのレコードをアクティブ化しました

UPDATE  dbo.SourceTable 
SET     IsActive = 1 
WHERE   (RowNumber % 9 = 3) 
OR      (RowNumber % 9 = 5) 
OR      (RowNumber % 9 = 6) 
OR      (RowNumber % 9 = 7)

行数-3

パッケージの2回目の実行は次のようになりました。314,268 rows最初の実行時に以前に挿入されたものは、ステージングテーブルにリダイレクトされました。628,766 new rows宛先テーブルに直接挿入されました。私のマシンでのパッケージの実行には約がかかりました12 seconds314,268 rows宛先テーブルのは、2番目のSQL実行タスクでステージングテーブルを使用したデータで更新されました。

実行-2

実行時間-2

行数クエリを再度実行して、3つのテーブルすべての行数を見つけました。

行数-3

それがあなたのソリューションを実装するためのアイデアを与えることを願っています。

于 2013-02-11T21:47:25.390 に答える
8

私が見る2つのことは、挿入(「テーブルまたはビュー-高速ロード」または「テーブル名またはビュー名変数-高速ロード」のいずれかを使用していることを確認してください)と更新です。

正しく決定したように、更新ロジックは通常、パフォーマンスが低下する場所であり、これは、OLEDBコンポーネントが通過する各行に対してシングルトン更新を実行するためです。これを克服するために人々がとる通常のアプローチは、挿入ロジックと同じように、すべての更新をステージングテーブルに書き込むことです。次に、をフォローアップしてData Flow Task一括Execute SQL Task更新を実行します。

サードパーティのツールを入手することを考えている場合、PragmaticWorksはアップサートの目的地を提供します

于 2013-02-11T20:24:49.673 に答える