5

したがって、SqlDataReaderは非常に高速であり、取得する行数がわからず、一度に各行にメモリを割り当てるだけであることを理解しています。したがって、100万行の小さな行(たとえば4〜32バイト)がある場合、読み取られる各行はサーバーへのラウンドトリップを意味しますか?バッファリングは正しく行われませんか?

SQL Native Clientを介してODBCを使用した場合、ラウンドトリップごとに512行をフェッチするように適切な大きさの行バッファーを設定できます。コンシューマーが行0を読み取ると、512行のフェッチを実行してから行0を返します。次の511回の読み取りはメモリアクセスであり、513回目の読み取りは新しいラウンドトリップです。

私にとって、これはより高速である必要があります(そして、転送のみである必要はありません)が、結果セットがサーバー上でどのように具体化されるかにも依存します。後者の場合、ネットワーク経由でフェッチを開始する前に結果セットを終了する必要がありますが、使用していると思われるSqlDataReaderおよびTDS(私がよく知らないプロトコル)の場合はそうではない場合があります。コメントをいただければ幸いです。

4

2 に答える 2

4

DataReader は、その API を介して一度に 1 行だけを渡しますが、データベースから一括フェッチし、データをバッファリングするため、行ごとにデータベースへの往復を行う必要はありません。

于 2009-11-08T12:00:30.200 に答える
3

いいえ、SqlDataReader はクライアント側でバッファリングを行います。行をフェッチするためにサーバーへのラウンドトリップを行っていることは間違いありません。

于 2009-11-08T11:59:43.790 に答える