3

DbDataReaders が実際にどのように機能するかを知っている人はいますか? 例として SqlDataReader を使用できます。

次のことをすると

cmd.CommandText = "SELECT * FROM Customers";

var rdr = cmd.ExecuteReader();

while(rdr.Read())
{
  //Do something
}

データ リーダーはすべての行をメモリ内に持っていますか、それとも 1 つだけを取得し、Read が呼び出されると、データベースに移動して次の行を取得しますか? 1 つだけメモリに取り込むとパフォーマンスが低下するようですが、すべてを取り込むと ExecuteReader の呼び出しに時間がかかります。

私はオブジェクトの消費者であることを知っており、彼らがそれをどのように実装するかは問題ではありませんが、私はただ興味があります.Reflectorが何をしているのかを知るために、Reflectorで数時間過ごすことになると思います.と思ったので、詳しい方にお聞きしたいと思います。

誰かがアイデアを持っているかどうか、私はただ興味があります。

4

2 に答える 2

5

ここで述べたように:

DataReaderを使用すると、データが利用可能になるとすぐにデータを取得することと、(デフォルトで)一度に1行だけをメモリに格納することでアプリケーションのパフォーマンスを向上させ、システムのオーバーヘッドを削減できます。

そして、私が知る限り、それがすべてのリーダーが.NETFrameworkで機能する方法です。

于 2010-03-25T13:11:34.473 に答える
4

ラプソディは正しい。

クエリが実行されると結果が返され、DataReader の Read メソッドを使用して要求するまで、クライアントのネットワーク バッファーに格納されます。

等しい 10,000 レコード データ セットで DataReaders と DataAdaptor を使用してテストを実行したところ、DataAdaptor は DataReader より一貫して 3 ~ 4 ミリ秒高速であることがわかりましたが、DataAdaptor はより多くのメモリを保持することになります。

等しい 50,000 レコード データ セットで同じテストを実行したところ、DataReader 側で 50 ミリ秒のパフォーマンス向上が見られました。

そうは言っても、実行時間の長いクエリや巨大な結果セットがある場合は、DataReader を使用したほうがよいと思います。結果をより早く取得し、メモリ内のすべてのデータを保持する必要がないからです。また、DataReader は前方のみであることを覚えておくことも重要です。そのため、結果セット内を移動する必要がある場合は、最適な選択ではありません。

于 2010-03-25T15:13:44.150 に答える