5

.Net で oracle から clob 列を読み込もうとしていますが、パフォーマンスが非常に低く、ネットワーク トラフィックが多いことがわかります。

ODP + OCI、devArt + OCI の方法で同じ結果のデータにアクセスしようとしました。データ リーダーで 1000 行を取得し、各行の clob 値を読み取るのに約 20 秒かかります。

Wireshark のトレースを調べると、リーダーの単一行の clob フィールドを読み取ろうとするたびに、クライアントとサーバー間で複数の tcp パケットが送信されていることがわかりました。したがって、1000 行の場合、1 行だけをクエリする場合よりも 1000 倍遅くなります。

同時に、SQL Developer (oci の代わりにシン jdbc ドライバーを使用していると思われる) で同じクエリを実行すると、clob 値を含む結果がすぐに得られます。各行に対して clob をクエリしようとはしません。すべてを一度に取得します。

しかし、.net 用のシン クライアントが表示されません。どうすればスピードアップできますか?助けてください!

編集: 私のフィールド型は実際には XMLTYPE であり、真の clob ではなく clob として保存されます。その上で getClobVal を使用すると、結果が 50% 向上し、1000 行で 10 秒になります。しかし同時に、Sql Developer は 10 秒ではなく即座に結果を返しています。

4

1 に答える 1

1

OracleがLOBの取得を遅らせることを正しく観察しました。したがって、アプリケーションのパフォーマンスは、ネットワークのラウンドトリップ時間によって制限されます。

クラスのInitialLOBFetchSizeプロパティOracleCommand(ODP.NETでは、ドキュメントを参照)を使用すると、行の最初の取得でLOBの一部を取得するようにOracleに指示できます。LOBが長すぎない場合、これはかなりの違いを生む可能性があります。

于 2012-01-12T16:13:04.163 に答える