1

ファイルに書き出す必要のある大量のデータを生成/返すOracleプロシージャがいくつかあります。私は現在、データリーダーで達成しようとしています。動作しているようですが、問題なく479MBのファイルを正常に生成できました。dataReaderを取得してからファイルを完成させるのに4分もかかりませんでした。

しかし、特定の手順で取得したdataReaderはクロールしています。信じられないほど遅いです。何が起こっているのかをよりよく理解するためにコードを変更しました。

System.Diagnostics.Debug.Write("Performing .Read() on DataReader: ")
Dim d1 As DateTime = DateTime.Now
Dim result As Boolean = myDataReader.Read()
Dim ts As TimeSpan = DateTime.Now.Subtract(d1)
System.Diagnostics.Debug.WriteLine(ts.ToString)

興味深いのは、私の出力が次のようになってしまうことです。

Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:00:00
Performing .Read() on DataReader: 00:07:33.5037500

私は次に何をすべきか本当に途方に暮れています。07:33.5037500を取る行については、ユニークなものや異なるものは何も見当たりません。助言がありますか?

編集:

みなさん、ありがとうございました。まず、私が知る限り、例外はスローされていません。提案されているように、私は上記の動作を示しているこの特定の手順を調べましたが、手順は途方もなく大規模です。しかし、Oracleの一時テーブルにデータを取り込むために多くのカーソルを使用しているように見えます。返される参照カーソルは、その一時テーブルのSELECT*FROMです。

.Netコードを削除したときにパフォーマンスの問題が存在するかどうかを確認するためにそのカーソルを開くPL/SQLブロックを作成しています。しかし、何か追加の考えがあれば、それは大いにありがたいです。

もう一度ありがとう。これはPL/SQLの問題であり、.NETの問題ではないようです。

4

3 に答える 3

3

データベースは実際に何をしていますか?

GROUPBYまたはORDERBYを使用したクエリでは、完全な結果セットを生成し、行を返す前にそれを並べ替え/集計する必要がある場合があります。大きなテーブルをスキャンするクエリは、最初の数ブロックで50行を見つけ、次に別のブロックを見つける前にさらに10万ブロックを読み取る場合があります。

VBコードを無視して、データベースコードを投稿することをお勧めします。

于 2010-11-10T04:37:58.973 に答える
2

「特定のプロシージャ」とは、REFCURSORであるOUTパラメータを持つOracleストアドプロシージャを呼び出していることを意味していると思います。次に、DataReaderは、プロシージャによって返されたカーソルからフェッチします。そうですか?

その場合、.Netコードを削除し、プロシージャを呼び出してカーソルからすべてのデータをフェッチするPL / SQLブロックを記述して、同じ動作が得られるかどうかを確認できますか?Oracleは、カーソルが開かれたときにデータを実体化しません。クライアントがデータをフェッチするときに結果を実体化します。したがって、OracleがN + 1行を見つける前に大量のデータを実体化してフィルターで除外する必要がある場合、OracleはN番目の行をフェッチするためにかなりの作業を行う必要がある可能性があります。データベースで実行されているPL/SQLで同じ動作が見られる場合は、ほぼ確実にそれが起こっています。PL / SQLブロックに問題がない場合は、中間層で何かが発生している必要があります。

于 2010-11-10T04:37:08.433 に答える
1

あなたの質問の元のバージョンについての一般的なコメントのほんの2、3:

Microsoft .NET Frameworkの組み込みのSystem.Data.OracleClientプロバイダークラスを使用している場合は、 Oracle独自の更新された.NETプロバイダーからパフォーマンスが向上する可能性があります。

実行ごとに時間がずれている場合は、.NETガベージコレクターが、例では見られないメモリ使用量の一部を開始している可能性があります(つまり、多くのオブジェクトがインスタンス化されて破棄されている場合)。

于 2010-11-10T04:53:51.703 に答える