web-dev-qa-db-ja.com

SSISパッケージの「ROW PER BATCH」と「MAX INSERT COMMIT SIZE」には関連性はありますか?

PRIMARY FILE GROUPを含む10のパーティションを持つSQL Serverデータベースに、1,000万のレコードを含む2.5 GBのデータをエクスポートするSSISパッケージがあります。

デフォルトを変更する前Max Insert Commit sizeie "2147483647" andRow per batch高速読み込みオプションを使用して変換を完了するには、7分かかりました。

しかし、それをいくつかの数式でまともな値に変更した後、実行はわずか2分で完了しました。

FYI-DefaultMaxBufferRowsDefaultMaxBufferSizeは、両方のシナリオ、つまり10000とそれぞれ10 MB。

計算するには最大挿入コミットサイズバッチごとの行以下の計算が使用されます。

1)転送されるソースからのレコードの計算された長さ。これは約1038バイトです。

CREATE TABLE [dbo].[Game_DATA2](
    [ID] [int] IDENTITY(1,1) NOT NULL, -- AUTO CALCULATED
    [Number] [varchar](255) NOT NULL, -- 255 bytes
    [AccountTypeId] [int] NOT NULL, -- 4 bytes
    [Amount] [float] NOT NULL,-- 4 bytes
    [CashAccountNumber] [varchar](255) NULL, -- 255 bytes
    [StartDate] [datetime] NULL,-- 8 bytes
    [Status] [varchar](255) NOT NULL,-- 255 bytes
    [ClientCardNumber] [varchar](255) NULL -- 255 bytes
)

2)バッチあたりの行数=レコードあたりのpackate_size /バイト数= 32767/1038 = 32約.

3)最大挿入コミットサイズ=パッケージサイズ*トランザクション数= 32767 * 100 = 3276700(パッケージサイズと数トランザクションは可変であり、要件に応じて変更できます)

質問 :

  • バッチごとの行数と最大挿入コミットサイズに関連性はありますか?アーカイブには情報が記載されていないため、DFT(DATA FLOW TASK)の実行を調整するための article です。

  • これらの設定はDefaultBuffermaxzieと一緒に機能しますか?
    DefualtBuffermaxrows?はい、どのようにですか?

7

これらのパラメーターはDFTを参照しますOLE DB Destination only。OLE DB Destination発行insert bulkコマンド。これらの2つのパラメーターは、次のように制御します。

  • 最大挿入コミットサイズ-1つのバッチに挿入されるデータの量を制御します。したがって、MICSを5000に設定し、9000行があり、最初の5000結果でエラーが発生した場合、5000のバッチ全体がロールバックされます。 MISCは、BULK INSERT transact-sqlコマンドのBATCHSIZE引数と同じです。
  • Rows Per Batch-クエリオプティマイザへの単なるヒント。この値は、実際に予想される行数に設定する必要があります。 RPBは、BULK INSERT transact-sqlコマンドのROWS_PER_BATCH引数と同じです。
    MICSの値を指定すると、いくつかの影響があります。各バッチはトランザクションログにコピーされるため、急速に拡大しますが、各バッチの後にトランザクションログをバックアップすることができます。また、ターゲットテーブルにインデックスがある場合、バッチが大きいとメモリに悪影響を及ぼし、テーブルロックを使用していない場合は、より多くのブロッキングが発生する可能性があります。

BULK INSERT(Transact-SQL)-MS Article このコマンド。

DefaultBuffermaxsizeおよびDefaultBuffermaxrowsコントロールRAM DFT自体の内部のバッファ管理であり、上記のオプションに干渉しません。

5
Ferdipux

バッチあたりの行数-この設定のデフォルト値は-1で、すべての受信行が単一のバッチとして扱われることを指定します。このデフォルトの動作を変更して、すべての受信行を複数のバッチに分割できます。許可される値は、バッチ内の最大行数を指定する正の整数のみです。

最大挿入コミットサイズ-この設定のデフォルト値は「2147483647」(4バイト整数型の最大値)で、すべての受信行が正常に完了すると一度コミットされることを指定します。この設定に正の値を指定して、それらの数のレコードに対してコミットが行われることを示すことができます。この設定のデフォルト値を変更すると、データフローエンジンに数回コミットするオーバーヘッドがかかります。はい、そうですが、同時に、トランザクションログとtempdbへの圧力が解放され、特に大量のデータ転送中に非常に大きくなります。

Tempdbとトランザクションログのパフォーマンスを向上させるために、上記の2つの設定を理解することは非常に重要です。たとえば、「最大挿入コミットサイズ」をデフォルトのままにすると、トランザクションログとtempdbは抽出プロセス中に増加し続け、大量のデータを転送している場合、結果としてtempdbはすぐにメモリ不足になりますこれは抽出に失敗します。したがって、これらの値を環境に基づいて最適な値に設定することをお勧めします。

注:上記の推奨事項は、DTSおよび過去2年間のSSISでの作業で得られた経験に基づいて作成されました。ただし、前述のとおり、他の要因があります。パフォーマンスに影響を与える要素の1つはインフラストラクチャとネットワークです。したがって、これらの変更を運用環境に適用する前に、十分なテストを行う必要があります。

2
Arvind Yadav

親愛なるHarsimranjeet Singh;

私の個人的な経験に基づいて、Rows_Per_Batchはバッチごとのoledb_destinationがDFTコンポーネントから受け取る必要のある行数を決定しますが、DefualtBuffermaxrowsはDFTのサイズを決定するため、DefualtBuffermaxrowsはSSISサーバーの仕様に依存し、Rows_Per_Batchは宛先サーバーに依存し、それぞれが条件を設定します。

また、Maximum_Insert_Commit_Sizeは、レコードがヒットしたときにレコード数を決定し、ログファイルに書き込んでコミットします。この数を減らすと、ログへの参照の数が増えますが、これは悪いことですが、MSDB(システムデータベース)が膨らまなくなり、パフォーマンスの向上に非常に適しています。

別のポイントは、一緒に設定する必要があるDefualtBuffermaxrowsとDeafultBufferSizeの関係です。 DefualtBuffermaxrowsに各レコードのサイズを掛けた値は、DeafultBufferSizeとほぼ等しい必要があります。これが大きい場合は、ssisを減らして到達し、これがそれより小さく、最小バッファーサイズよりも小さい場合は、増加して最小バッファーサイズにタッチします。これらの操作は、パッケージのパフォーマンスを大幅に低下させます。

幸運を!

1
Saeid Yousefi