5

データベースを Sybase から Oracle に変換中ですが、パフォーマンスの問題が発生しました。Sybase には TEXT フィールドがあり、Oracle ではそれを CLOB に置き換えました。

これは、Java コードでデータにアクセスする方法です。

while(rs.next()) {
  String clobValue = rs.getString(1);  // This takes 176ms in Oracle!
  .
  .
}

データベースは全国にありますが、それでも、Sybase とその TEXT データの取得にパフォーマンス上の問題はありませんでした。

このパフォーマンスを向上させるためにできることはありますか?

4

3 に答える 3

4

デフォルトでは、LOB はテーブル データと一緒にフェッチされず、getString.

Oracle の.NETプロバイダを使用している場合InitialLOBFetchSizeは、データ リーダーの設定で、メモリ内の大きなオブジェクトを収容するのに十分な大きさの値に設定して、他のデータと一緒にオブジェクト全体を取得できるようにすることができます。

于 2011-07-19T17:05:59.813 に答える
3

その他のオプション:

LOB列はインライン(データ行)またはアウトオブライン(別の場所)に格納されていますか? LOB 列が小さい (サイズが 4k 未満) 傾向にある場合は、ENABLE STORAGE IN ROW句を使用して、可能な場合はデータをインラインで格納するように Oracle に指示できます。

LOB が大きく、頻繁に使用される場合、LOB はバッファ キャッシュに格納されていますか? 10g のデフォルトでは、LOB は です。つまり、LOBNOCACHEに対する各 I/O 操作には、データベースへの直接読み取り (同期ディスク イベント) が含まれるため、処理が遅くなる可能性があります。データベース トレースは、イベントの重大な待機を明らかにしdirect path read / direct path writeます。

『Oracle Application Developer's Guide - Large Objects』のこの章は、読む価値があります。

于 2011-07-19T18:30:54.247 に答える
0

私たちは、Clob のパフォーマンスを無視できる別のアプローチを取ることにしました。

現在のコード (私が書いたわけではありません!) は、データベース内のテーブルにクエリを実行し、CLOB を含むテーブル内のすべての情報を取得します。代わりに、varchar の最初の 4k 文字で別のフィールドを作成し、代わりにクエリを実行しました。次に、完全な clob が必要な場合は、すべてのレコードのすべての clob ではなく、個別にクエリを実行します。

于 2011-07-22T02:07:45.440 に答える