2011-07-19 16 views
5

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

この私たちは、Javaコード内のデータにアクセスする方法されます。データベースは、全国各地で

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

、それでも、我々は、SybaseおよびTEXTデータのその検索で任意のパフォーマンスの問題を持っていませんでした。

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

答えて

3

いくつかの他のオプション:

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

LOBが大きくて頻繁に使用される場合は、バッファ・キャッシュに格納されていますか? 10gのデフォルトは、LOBがNOCACHEであることです。これは、各入出力操作がデータベースへの直接読み取り(同期ディスク・イベント)が遅くなることを意味します。データベーストレースは、direct path read/direct path writeイベントの重要な待機を明らかにするでしょう。

This chapter「Oracle Application Developer's Guide - Large Objects」は、貴重な資料となります。

+0

これは、答えにつながったかもしれない情報を提供するのに最も近いので、これを答えとしてフラグを立てています:) – wsaxton

4

デフォルトでは、LOBは表データと共にフェッチされず、データベースに追加の往復を行い、getStringにフェッチします。

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

+0

残念ながら、私たちはこのフレームワークを使用していません。 SolarisではJDBCを使用しています。 – wsaxton

0

私たちは、clobのパフォーマンスを無視できるようにする別のアプローチを採用することに決めました。

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

関連する問題