web-dev-qa-db-ja.com

SSISデータフローデータアクセスモード-「テーブルまたはビュー」と高速ロードのポイントは何ですか?

SQL Server Business Intelligence Development Studioを使用して、OLE DB宛先データフローに多くのフラットファイルを実行して、SQL Serverテーブルにデータをインポートします。=の「データアクセスモード」の下でOLE DBデスティネーションエディタ、デフォルトは「テーブルまたはビュー-高速ロード」ではなく「テーブルまたはビュー」です。違いは何ですか。認識できる唯一の違いは、高速ロード転送です。データがはるかに速くなります。

9
coburne

OLE DBデスティネーションコンポーネントのデータアクセスモードには、高速と非高速の2種類があります。

「テーブルまたはビュー-高速ロード」または「テーブルまたはビュー名変数-高速ロード」のいずれかが高速の場合、データはセットベースでロードされます。

遅い-「テーブルまたはビュー」または「テーブルまたはビュー名変数」のいずれかにより、SSISがデータベースにシングルトン挿入ステートメントを発行します。 10、100、場合によっては10000行をロードしている場合、2つの方法のパフォーマンスにはほとんど違いがありません。ただし、ある時点で、SQL Serverインスタンスをこれらの非常に小さな要求で飽和させることになります。さらに、トランザクションログの大部分を悪用します。

なぜ非高速なメソッドが必要なのですか?悪いデータ。 10000行のデータを送信し、9999番目の行の日付が2015-02-29である場合、10,000個のアトミック挿入とコミット/ロールバックがあります。 Fastメソッドを使用していた場合、1万行のバッチ全体がすべて保存されるか、どれも保存されません。エラーが発生した行を知りたい場合、最低レベルの粒度は10k行です。

現在、できるだけ多くのデータを可能な限り高速にロードし、それでもダーティデータを処理する方法があります。これは カスケード障害 アプローチであり、次のようになります。

cascading failure insert

一度にできるだけ多くのサイズを挿入するのに適切なサイズを見つけるという考えですが、不良データを取得した場合は、連続して小さいバッチでデータを再保存して、不良行に移動しようとします。ここでは、10000の最大挿入コミットサイズ(FastLoadMaxInsertCommit)から始めました。エラー行の処理で、_Redirect Row_から_Fail Component_に変更しました。

次の宛先は上記と同じですが、ここでは高速ロードを試み、100行のバッチで保存します。繰り返しますが、テストするか、妥当なサイズを思い付くように見せかけます。これにより、どこかにがわかっているため、100行の100バッチが送信され、テーブルの整合性制約に違反した行が少なくとも1つあります。

次に、3つ目のコンポーネントをミックスに追加します。今回は、1つのバッチで保存します。または、同じ結果が得られるので、テーブルアクセスモードをFast Loadバージョンから変更することもできます。各行を個別に保存します。これにより、単一の不良行で「何か」を実行できるようになります。

最後に、フェイルセーフの宛先があります。多分それは意図した宛先と「同じ」テーブルですが、すべての列はnvarchar(4000) NULLとして宣言されています。最終的にそのテーブルに到達するものは何でも調査してクリーンアップ/破棄する必要があるか、または悪いデータ解決プロセスが何であれ。他の人はフラットファイルにダンプしますが、実際には、不良データの動作を追跡する方法に意味のあるものは何でもあります。

13
billinkc

Fast Loadは FAST LOADオプション で詳細に文書化されています

  • インポートしたデータファイルのID値を保持するか、SQL Serverによって割り当てられた一意の値を使用します。

  • 一括読み込み操作中にnull値を保持します。

  • 一括インポート操作中にターゲットテーブルまたはビューの制約を確認します。

  • 一括読み込み操作の間、テーブルレベルのロックを取得します。バッチの行数とコミットサイズを指定します。


違いはなんですか;認識できる唯一の違いは、高速のロードがデータをはるかに高速に転送することです。

内部では、table or viewは挿入するすべての行に対して個別のSQLコマンドを使用しますが、table or view - with fast loadはBULK INSERTコマンドを使用します。

BULK INSERT で使用可能な上記のオプションが表示された場合number of rows in the batch = ROWS_PER_BATCHおよびcommit size = BATCHSIZE

別のシナリオは..

デフォルトの最大挿入コミットサイズ(2147483647)が高すぎます。したがって、たとえば500K行を挿入していますが、PK違反のため、バッチは失敗します。このシナリオでは、FAST LOADオプションを使用すると、バッチ全体が失敗します。エラーの説明も取得できません。

これは、宛先エラー出力としてtable or viewを使用できる場所です。したがって、500Kのうち、5Kの挿入コミットサイズからFAST LOADを使用します。そのバッチの1行が失敗した場合、それらの5Kバッチをtable or viewロードに​​リダイレクトします。これは、行ごとの挿入を5K行にのみ使用し、table or viewのエラーをフラットファイルにリダイレクトすることもできます。 .. 5Kの場合、いずれかの行がバッチで失敗した場合、失敗の原因を特定できます。

上記の方法の利点は、どの行も失敗しない場合、バッチ全体に対してBULK INSERT(高速ロード)を使用することです。

SSIS愛好家 billinkcStackoverflowで同様の質問に答えた

5
Kin Shah