2

SQLServer2008ボックスがあります。このサーバーには、xmlファイルを開いてテーブルにロードする大規模なストアドプロシージャを呼び出すスケジュールされたジョブがあります。

長期間の稼働後、SQLサーバーは文字通りすべての使用可能なメモリを消費します。(実際、ページファイルはほぼすべてのディスクスペースを消費しました)

ストアドプロシージャがメモリをリークする可能性はありますか?SSISパッケージがメモリをリークする可能性はありますか?

前もって感謝します!!

4

1 に答える 1

7

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

于 2012-11-16T01:13:30.027 に答える