SQLServer2008ボックスがあります。このサーバーには、xmlファイルを開いてテーブルにロードする大規模なストアドプロシージャを呼び出すスケジュールされたジョブがあります。
長期間の稼働後、SQLサーバーは文字通りすべての使用可能なメモリを消費します。(実際、ページファイルはほぼすべてのディスクスペースを消費しました)
ストアドプロシージャがメモリをリークする可能性はありますか?SSISパッケージがメモリをリークする可能性はありますか?
前もって感謝します!!
SQLServer2008ボックスがあります。このサーバーには、xmlファイルを開いてテーブルにロードする大規模なストアドプロシージャを呼び出すスケジュールされたジョブがあります。
長期間の稼働後、SQLサーバーは文字通りすべての使用可能なメモリを消費します。(実際、ページファイルはほぼすべてのディスクスペースを消費しました)
ストアドプロシージャがメモリをリークする可能性はありますか?SSISパッケージがメモリをリークする可能性はありますか?
前もって感謝します!!
sp_xml_removedocument
はい、 (一致するものごとにsp_xml_preparedocument
)呼び出すのを忘れると、メモリリークが発生する可能性があります。
解析されたドキュメントは、SQLServerの内部キャッシュに保存されます。MSXMLパーサー(Msxmlsql.dll)は、SQLServerで使用可能な合計メモリの8分の1を使用します。メモリ不足を回避するには、sp_xml_removedocumentを実行してメモリを解放します。
使用例:
DECLARE @xml_text VARCHAR(4000), @i INT
SELECT @xml_text = '<root>
... some valid xml ...
</root>'
EXEC sp_xml_preparedocument @i OUTPUT, @xml_text
....
EXEC sp_xml_removedocument @i
メモリリークのもう1つの形式は、カーソルのクローズと割り当て解除の両方を忘れることです。
DECLARE c CURSOR
LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR SELECT ...
....
CLOSE c;
DEALLOCATE c;
[注:カーソルを使用することはめったにありません。可能な限り適切な場合は常に、セットベースの方法でそれを行うようにしています]
念のために言っておきますが、私は常に明示的なカーソルを見るのが好きCLOSE
ですDEALLOCATE
。
LOCALカーソルは、カーソルがパラメーターとして戻されていない限り、それらが作成されたストアード・プロシージャー、トリガー、またはバッチが終了すると、暗黙的に割り振り解除されます。プロシージャを呼び出したコードでカーソルを参照しているパラメータまたは変数がスコープ外になると、LOCALカーソルの割り当てが暗黙的に解除されます。 Ref。