大規模な PL/SQL プロセスの一部として、組み込みの REPLACE 関数を CLOB 変数で使用する必要があります。私はOracle 11g R2を使用しており、必要に応じて置換を行うという点で関数は正常に動作しますが、手順が実行されると(処理するレコードは約250万件あります)、ひどく遅くなります-次のように:
- 最初の 20,000 レコード: ~12 分
- 20,000 レコード: ~24 分
- 3 番目の 20,000 レコード: ~37 分
- 4 番目の 20,000 レコード: ~52 分
- 等...
操作中に V$TEMPORARY_LOBS をチェックすると、処理される行ごとに CACHE_LOBS の値が増加することが示されます - これは、LOBS (この場合は CLOBS) に関連付けられたメモリが一度使用されると解放されないことを意味すると思います...?
PL/SQL デバッガーを使用してコードをステップ実行すると、REPLACE 関数を呼び出すたびに CACHE_LOBS の値が 2 ずつ増加することがわかります。関数呼び出しは次のようになります。
clobRTFText CLOB;
...
dbms_lob.createtemporary(clobRTFText, TRUE, dbms_lob.call);
...
clobRTFText := REPLACE(clobRTFText, '<CR>', '\par '); <== Causes CACHE_LOBS to increase by 2
...
dbms_lob.freetemporary(clobRTFText); <== Doesn't seem to cause CACHE_LOBS to decrease
上記のコードの 3 行目は、追加の CLOB 変数をオンザフライで作成しているようです。VARCHAR2 パラメータを期待する REPLACE 関数が原因で、ある種の暗黙的な型変換が発生しているためですか? 「clobRTFText := REPLACE...etc」の代わりに dbms_lob.copy を使用してみましたが、実際にはもっとひどいものでした (つまり、CACHE_LOBS がさらに速く増加しました)。理由が何であれ、dbms_lob.freetemporary を呼び出しても、CACHE_LOBS の値に違いはないようです。
OracleドキュメントのPL/SQL Semantics for LOBsセクションを調べました.CLOBおよびVARCHAR2変数を組み込み関数で使用できる方法について言及していますが、余分なメモリ使用量を引き起こす可能性があることについては何も見つかりません.
なぜこれが起こっているのか、またはどのようにそれを行うことができるのか (つまり、CLOB で REPLACE を使用する)、メモリの解放に失敗することはありませんか (それが実際に起こっていると仮定します)。
ありがとう