PL/SQL ストアド プロシージャで多数の CLOB 変数を使用して多数の長い文字列を格納すると、パフォーマンスの問題は発生しますか? CLOBの長さも可変ですか? varchar2 と long を使用する代わりに CLOB の既知の制限/欠点はありますか?
3 に答える
はい、CLOBの長さは可変です。上限は、使用している Oracle のバージョンとデータベースのブロック サイズによって異なります。11Gの場合、制限は「4G * DB_BLOCK_SIZEパラメータの値」です( 11G PL/SQL言語リファレンスから)。VARCHAR2 値は、PL/SQL では 32767 バイトに制限されています。
PL/SQL での CLOB と VARCHAR2 の相対的なパフォーマンスに関する決定的な情報はありません。簡単な Google も有用なものを返しませんでした。ただし、VARCHAR2 の方が単純であるため、一般的に (どちらかに格納できるデータの場合) CLOB よりもパフォーマンスが優れていると強く思います。同じ単純なプログラムを VARCHAR2 で 1 回、CLOB で 1 回作成し、それぞれ数千回実行して合計経過時間を比較することで、これが正しいか間違っているかを証明するテストを簡単にセットアップできます。Tom Kyte のRunstatsユーティリティはここで非常に役立ち、Oracle リソースに関して 2 つのアプローチのその他の違いを示しています。
私のアドバイスは次のとおりです。データが 32K を超える場合は、CLOB を使用する必要があります。そうでない場合は、CLOB を使用せず、VARCHAR2 を使用してください。
注意: CLOB がすべてのサイズの文字データに対して VARCHAR2 よりも優れている場合、Oracle はおそらく VARCHAR2 を非推奨にするでしょう。LONG データ型の場合と同様ですが、そうではありません。
CLOB は、VARCHAR2 よりも大幅にコストが高く (遅く)、操作が困難です。VARCHAR2 の代わりに不必要に CLOB を使用すると、測定可能なパフォーマンスの低下が発生します。
最終的には、前述のように、適切なジョブに適切なデータ型を使用する必要があります。
1) データベースに 4000 バイト以下を格納する場合は VARCHAR2 を使用し、それ以外の場合は CLOB を使用します。
2) PLSQL に 32k バイト以下を格納する場合は VARCHAR2 を使用し、それ以外の場合は CLOB を使用します。
それはあなたが必要とするものすべてです。データが VARCHAR2 制限を超える可能性がある場合は、CLOB を使用してください。それ以外の場合は、VARCHAR2 を使用してください。
明確な否定については、どのような種類の LOB データ型でも操作する場合、LOB は TEMPORARY (テーブルの実際の行に格納されない) または PERMANENT (テーブルの実際の行に格納される) のいずれかになる可能性があることを考慮してください。PLSQL で CLOB を動的に構築し、その CLOB を JAVA または他の外部クライアントに渡す場合、一時 CLOB を作成し、それを Oracle データベースの制御外にプッシュしたことになります。これは、一時 CLOB を受け入れるコードが、CLOB の使用が終了したときに CLOB を解放する責任があることを意味します。コードには、この目的で使用できる、その環境に固有のメソッドが必要です。そうしないと、一時記憶域の表領域が最終的にいっぱいになり、データベースが失速します (動作を停止します)。クラッシュすることはありません。動作しないだけです。再起動が必要になる可能性があります。
幸運を。
CLOB 変数は基本的にポインターであるため、本質的に遅くはありません。問題は、CLOB のコンテンツへのアクセスです。私の経験では:
- Oracle の暗黙的な CLOB <-> VARCHAR2 変換に依存すると、遅くなる傾向があります。
- パッケージの
dbms_lob
操作は適度にパフォーマンスが高いです。ループでこれを行うだけです:- CLOB からデータのチャンクを取得してバッファに入れる
- バッファからのデータを使用します。多分それを別のデータの塊に変換します。
- 場合によっては、変換されたデータのチャンクを宛先 CLOB に書き込みます。