2012-02-07 10 views
1

私は参照カーソルを返すプロシージャを持っています。それは4つのパラメータを取ると私はC#を使用しています。私はすべてのネット経由の例について見てきましたが、それらのいずれかが、これは私がそれを毎回20秒を取ったことを除いて、私はうまく働いたデータセットを使用していたC#でカーソルを戻すSPでOracle ODP.net ExecuteReaderを使用するにはどうすればよいですか?

public static int test(int test_id, int progr, int setID, string BFilter) 
{ 
    object cur1 = System.DBNull.Value; 
    string spname = "SP.GetValues"; 

    using (Oracle.DataAccess.Client.OracleCommand command = DB.GetStoredProcCommand(spname, test_id, progr, setID, BFilter, cur1)) 
    { 
    using (OracleDataReader reader = command.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
     //load array 
     } 
    } 
    } 

    int t = 1; 
    return t; 
} 

を持っているものである

動作させることはできません500行を取得するには、私は800回行う必要があります。私はdatareaderを使用して配列にロードし、配列をループすることはデータセットを読み込むよりも速いと考えました。 SP自体は帰還に1秒かかり、充填ラインに19秒を費やします。

+0

@ user72226 - 問題が機能ではなくパフォーマンスである場合は、SQL * Plusなどのカーソルから取り出してみましたか? Oracleでは、問合せの実行を開始する前にカーソルをオープンすることができるため、カーソルがすぐに開かれる可能性はありますが、データのフェッチを開始するときに実際に問合せを実行するには時間がかかります。 –

+0

それを試して、それを1秒以内にします。遅延は、C#側のデータセットを埋めることにあります。私は、データ・アーダが高速であるかどうかテストしたいが、例は見つけられない。 – user722226

答えて

0

Oracle Ref Cursorを使用している場合、マーク・ウィリアムのブログにはneat article on using "fetch size" to increase performanceがあります。非常に興味深い読書で、サンプルを始めるには良い場所になるかもしれません。

少し古くなっています(そして、入場料として、私は数年間ODP.NETに触れていませんでした)が、ODP.NETが根本的にそのスポットを変えたのか疑問です。

+0

面白いヒントは、サポートされていないハックの使用に依存しています。これは、プロダクション環境で使用され、サポートされていない機能理由を意図的に使用して終了させます。 – user722226

+0

ODPとrefカーソルで最後に試したときに使用したコードを掘り下げることができるかどうかを確認する必要があります。私はそれがまだ適切だと考えています(Oracleは、新しいリリースで完全にホイールを再構築することは知られていましたが)。 –

+0

RowsizeはOracleDataReaderの公式なプロパティであるため、Mark Williamsのブログのハックはもはや必要ありません。 ODP.NETは古いOracle Databaseバージョンを後ろ向きにサポートしていることに注意してください。たとえば、ODP.NET 11.2はOracle 9.2をサポートしています。したがって、ODP.NETの古代版にとどまる必要はありません。 –

0

ref型の出力パラメータとして指定する必要があります。カーソル、 詳細については、次のリンクを確認してください。ODP.NET in-out Curors

関連する問題