質問: 私は1つのデータベースから他のデータベースへのデータの一括コピーのためにSQLジョブを使って実行するssisパッケージを持っています。宛先は、データベース用の十分なスペースがある統合サーバーです。しかし、私はこの仕事(すなわちパッケージ)を実行します。 localsettings / tempフォルダに1GBのmdfファイルの順番に膨大な数の一時ファイルを作成し、20GBの一時ファイルを作成します。私はこのパッケージを手動で作成してインポートエクスポートウィザードを使用しませんでした。実行中にこの巨大な一時ファイルを避ける方法を教えてもらえますか? 注:インポートエクスポートウィザードを使用してパッケージを作成し、多くのテーブルに対して最適化を設定すると、多くの人がこれを実行します。しかし、このパッケージでは、私は1つのテーブルのみをクエリし、インポートエクスポートウィザードを使用せずに手動で作成しました。
回答: パッケージが一時ファイルを作成するのはなぜですか? SSISはメモリ内のすべてを保持できず、ディスクへのスワップを開始する場合を除いて、インメモリETLソリューションです。 @jeff hornbyが助けを提案したようにパッケージを再構築するのはなぜですか? 完全および部分的にブロックする変換は、データフロー内のメモリコピーを強制します。それぞれに1MBのデータを格納する10個のバケットがあるとします。ブロッキング変換を使用する場合、それらのバケットが変換に到達すると、データはあるメモリ位置から別のメモリ位置にコピーされなければなりません。これで、すべての変換の前に10MBのデータが使用され、その後に10MBのデータがある場合は、パッケージの合計メモリ消費量を2倍にしました。 必要な列だけを使用してください。列が宛先にない場合は、データフローに追加しないでください。ソートとマージを実行するには、データベースを使用します。データフローにヒットする前に、データを適切なタイプにキャストします。 一時ファイルの使用を引き起こしている原因 ルックアップ変換。私は、 `SELECT * FROM dbo.BillionRowTable`を使用すると、現在の期間に必要なものすべてが1つまたは2つの列であった場合、人々がETLサーバーを押しつぶすのを見てきました。ルックアップ操作のデフォルトの動作は、そのソースクエリを実行し、その結果をメモリにキャッシュすることです。 SSISが実行前フェーズの一部としてすべてのデータをストリーミングしてキャッシュするため、データフローが実行されていないように見えることがあります。 バイナリ/ LOBデータ。ソーステーブルに(n)varchar(max)/ varbinary(max)または古典的なBLOBデータ型がありますか?申し訳ありませんが、それは記憶に残ることはありません。代わりに、データフローはポインタを持ち、それらのオブジェクトのそれぞれについてファイルを書き出します。 並列処理が多すぎます。 SSISはあなたのproessingの自由な並列化を得ることで素晴らしいです。あなたは良いことをあまりにも多く持つことができます。スペース内に20のデータフローがすべて優先順位なしで浮動している場合、Integration Servicesエンジンはそれらをすべて一度に実行しようとする可能性があります。操作の*いくつか*のシリアル化を強制することは完了時に(成功した場合に/フェイル上)だけだ場合でも、それらの間の優先順位制約を追加します。データフロー内で、関連のない操作を続けることによって、同じ課題を導入することができます。私の経験則では、任意のソースまたは宛先から開始すると、他のすべてのソース/宛先に到達できるはずです。 他に何ができますか? ボックス上のメモリを使用しているものを調べます。 SQL Serverのメモリの最大値を正常(デフォルト以外)に設定しましたか?太った子供のようなSSISはケーキが大好きなので、データベース自体とSSISのメモリニーズをバランスさせる必要があります.SISはデータベース空間を完全に別にしています。 各データフローには、BufferTempStoragePathおよびBlobTempStoragePath [2 ]を設定する機能があります。これを利用して十分な記憶容量を備えたドライブに置きます 最後に、RAMを追加します。上記を実行してパッケージを改善できない場合は、ハードウェアを追加して実行してください。