4

あるデータベースから別のデータベースにデータを一括コピーするためにSQLジョブを使用して実行するssisパッケージがあります。宛先は、データベースに十分なスペースがある統合サーバーです。しかし、このジョブ(つまりパッケージ)を実行すると。localsettings/temp フォルダーに膨大な数の一時ファイルが作成され、1 GB の mdf ファイルに対して 20 GB の一時ファイルが作成されます。このパッケージを手動で作成し、インポート エクスポート ウィザードを使用しませんでした。実行中にこの巨大な一時ファイルを回避する方法を教えてください。さらに詳細が必要な場合は、言及してください。

注: インポート エクスポート ウィザードを使用してパッケージを作成し、多数のテーブルの最適化を true に設定すると、これが発生すると多くの人が言いました。しかし、このパッケージでは、1 つのテーブルのみを照会し、インポート エクスポート ウィザードを使用せずに手動で作成しました。

4

2 に答える 2

7

パッケージが一時ファイルを作成するのはなぜですか?

SSIS はメモリ内の ETL ソリューションですが、すべてをメモリ内に保持できず、ディスクへのスワップを開始する場合を除きます。

@jeff hornbyが提案したようにパッケージを再構築するのはなぜですか?

完全または部分的にブロックする変換では、データ フローでメモリ コピーが強制的に実行されます。それぞれ 1MB のデータを運ぶ 10 個のバケットがあるとします。ブロッキング変換を使用する場合、これらのバケットが変換に到達すると、データをあるメモリ ロケーションから別のメモリ ロケーションにコピーする必要があります。これで、union all 変換の前に 10MB のデータが使用され、その後にさらに 10MB のデータが使用されるため、パッケージの合計メモリ消費量が 2 倍になりました。

必要な列のみを使用してください。列が宛先にない場合は、データ フローに追加しないでください。データベースを使用してソートとマージを実行します。データ フローに到達する前に、データを適切な型にキャストします。

他に何が一時ファイルの使用を引き起こしている可能性がありますか

ルックアップ変換。SELECT * FROM dbo.BillionRowTable現在の期間に必要な列が 1 つまたは 2 つだけであったときに、ETL サーバーを使用すると、人々がクラッシュするのを見てきました。ルックアップ操作のデフォルトの動作は、そのソース クエリを実行し、結果をメモリにキャッシュすることです。幅の広いテーブルや深いテーブルの場合、SSIS が実行前フェーズの一部としてすべてのデータのストリーミングとキャッシュにビジーであるため、データ フローが実行されていないように見えることがあります。

バイナリ/LOB データ。ソース テーブルに (n)varchar(max)/varbinary(max) または従来の BLOB データ型がありますか? 申し訳ありませんが、それは記憶に残りません。代わりに、データ フローはポインターを持ち、それらのオブジェクトごとにファイルを書き出します。

並列処理が多すぎる。SSIS は、処理を自由に並列化できるという点で優れています。あなたがあまりにも多くの良いものを持つことができることを除いて。20 個のデータ フローがすべて空間に浮遊し、それらの間に優先順位がない場合、Integration Services エンジンはそれらすべてを一度に実行しようとする場合があります。操作のシリアル化を強制するために、完了時 (成功時/失敗時) であっても、それらの間に優先順位の制約を追加します。データ フロー内で、無関係な操作を実行することで、同じ問題が発生する可能性があります。私の経験則では、任意の送信元または宛先から開始して、他のすべての送信元/宛先に到達できる必要があります。

他に何ができますか?

ボックスで他に何がメモリを使用しているかを調べます。SQL Server の適切な (既定ではない) 最大メモリ値を設定しましたか? SSIS は RAM に似ており、太った子供はケーキが大好きなので、SSIS のメモリ ニーズとデータベース自体のバランスを取る必要があります。これらは完全に独立したメモリ空間を持っています。

各データ フローには、[BufferTempStoragePath および BlobTempStoragePath 2を設定する機能があります。これを利用して、十分なストレージのあるドライブに置きます

最後に、RAM を追加します。上記の方法でパッケージを改善できない場合は、さらにハードウェアを投入して完了です。

于 2012-08-18T20:06:42.287 に答える
4

非常に多くの一時ファイルを取得している場合は、データフローに多くのブロッキング変換が含まれている可能性があります。次のタイプの変換を排除してみてください:集計、ファジーグループ化、ファジールックアップ、行サンプリング、並べ替え、用語抽出。また、トランザクションを部分的にブロックすると、同じ問題が発生する可能性がありますが、同じ規模ではありません:データマイニングクエリ、マージ、マージ結合、ピボット、用語ルックアップ、ユニオンオール、アンピボット。これらの変換を最小限に抑えることをお勧めします。

おそらく問題は、データフローのどこかでのソート変換です(これが最も一般的です)。SQLステートメントでORDERBY句を使用することで、これを排除できる場合があります。データソースでsortedプロパティを設定することを忘れないでください。

于 2012-08-17T14:52:57.057 に答える