パッケージが一時ファイルを作成するのはなぜですか?
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 を追加します。上記の方法でパッケージを改善できない場合は、さらにハードウェアを投入して完了です。