0

FetchSize に値を割り当てる必要があります。rowsize は、リフレクションを使用して datareader から受け取ることができます。

しかし、行数が必要です。rowsize * 100000 (rowcount ではなく) としてハードコーディングできますか。

executedataReader は複数のストアド プロシージャに使用され、行数を取得できません。

            OracleDataReader dr = command.ExecuteReader();

            Int32 rowCount = 100000; //in this case actual result will be just 20k only. will it have any issue?

            FieldInfo fi = dr.GetType().GetField("m_rowSize", BindingFlags.Instance | BindingFlags.NonPublic);

            Int32 rowSize = Convert.ToInt32(fi.GetValue(dr));

            dr.FetchSize = rowCount * rowSize;

            while (dr.Read())
            {
                string myField = (string)dr[0];
                Console.WriteLine(myField);
            }

これを修正することで何かデメリットはありますか?

4

1 に答える 1

3

このFetchSizeプロパティは、データベースへの 1 回の「フェッチ」に割り当てられるメモリの量を制限します。フェッチ サイズが小さいほど、データを取得するためのラウンド トリップが多くなりますが、同時にクライアントで使用されるメモリも少なくなります。

フェッチ サイズを次のように設定RowSize * nすると、リーダーは常に一度に多くの n行をフェッチするように指示されます。n等しいと設定RowCountすると、「結果セット全体を一度に取得する」と言っています。固定数に等しく設定nすると、「一度に 1000 行 (または 10000 行または 25000 行など) をフェッチしてください」と言っています。を呼び出すDataReader.Read()と、データ リーダーは既にフェッチしてキャッシュした行を返そうとします。一度に 100,000 行をフェッチするように要求した場合、100,000 回の呼び出しごとに 1 回だけ Oracle と通信する必要がありRead()ます。

フェッチ サイズが大きいほど、ネットワーク トラフィックが効率的になり、データベースへのトリップが少なくなるため、ほとんどの状況で一般的に「高速」になります。ただし、これはクライアントで比較的多くのメモリが使用されることを意味するため、フェッチ サイズが非常に大きくなると、ガベージ コレクションやページングの問題が発生する可能性があります。それはあなた次第です。

FetchSize行サイズの倍数ではない値を割り当てることは完全に合法であることに注意してください。フェッチごとに未使用の残りのメモリが発生するだけです。行サイズが異なる複数のストアド プロシージャに同じオブジェクトを使用している場合は、大きな値 (実際のバイト数) を前もってCommand設定し、それをすべてに使用する方がよい場合があります。FetchSize

于 2012-07-20T13:52:15.817 に答える