2

あるデータベースから別のデータベースに CLOB をコピーしようとすると、Oracle (11g) のパフォーマンスが低下します。いろいろ試してみましたが、これを改善できませんでした。

CLOB は、レポート データの収集に使用されます。これは、レコードごとに非常に大きくなる可能性があります。リモート データベース (WAN 経由) でプロシージャを呼び出してデータを構築し、その結果を本社のデータベースにコピーして比較しています。一般的な形式は次のとおりです。

CREATE TABLE my_report(the_db VARCHAR2(30), object_id VARCHAR2(30), 
final_value CLOB, CONSTRAINT my_report_pk PRIMARY KEY (the_db, object_id));

パフォーマンスを向上させるために、リモート サイトの結果をテーブルのリモート コピーに蓄積します。手順の実行の最後に、データをコピーして戻そうとします。このクエリは非常に単純です。

INSERT INTO my_report SELECT * FROM my_report@europe;

私が見ているパフォーマンスは、1 秒あたり約 9 行で、平均 CLOB サイズは 3500 バイトです。(このサイズは VARCHAR2 の制限である 4k を超えることが多いため、CLOB を使用しています。) 70,000 レコード (珍しくありません) の場合、転送に約 2 時間かかります。メソッドを使用してみましcreate table as selectたが、これでも同じパフォーマンスが得られます。SQL*NET のチューニングにも数時間以上を費やしましたが、改善は見られません。Arraysize を変更してもパフォーマンスは向上しません (ただし、値を小さくするとパフォーマンスが低下する可能性があります。

古い exp/imp メソッド (テーブルをリモートからエクスポートし、インポートして戻す) を使用してコピーを取得することはできますが、これははるかに高速に実行されますが、これは私の自動レポートではかなり手動です。このデータを選択するためのパイプライン化された関数を作成して、それを使用して CLOB を BYTE/VARCHAR2 チャンク (追加のチャンク番号列) に分割することを検討しましたが、誰かが試して見つけた場合はこれを実行したくありませんでした問題。

ご協力いただきありがとうございます。

4

1 に答える 1