大きなテーブル (2,000,000 行) があり、テーブル全体をメモリにロードせずに、各レコードを一度に 1 つずつ画面に出力したいと考えています。
//pseudo code
var cmd = new NpgSQLCommand();
cmd.CommandText = "SELECT * FROM mytable;"
IReader reader = cmd.ExecuteReader(); //blocks until the entire set is returned
while(reader.Read()) //ideally each call to read loads more results from the db.
{
// print record name
}
したがって、上記のコードに示されているように、セット全体がメモリにロードされるまで ExecuteReader() は続行されません。結果がストリーミングされるように、この動作を変更するにはどうすればよいですか?
ありがとう
ETA: これは宿題のように思えますが、そうではありません。これは、1 つのクエリでテーブル全体を読み取り、一度に 1 行ずつ結果を処理するという問題を説明する簡単な方法です。
ETA x2:
npgsql からの警告: ExecuteReader と大きなテーブルを呼び出す場合、既知の問題があります。現在、Npgsql のバージョン 1 は、返す前にテーブルからすべてのデータを取得します。このような場合にパフォーマンスが低下する場合は、サーバー カーソルを使用して行をページングする必要がある場合があります。そのためには、次のようなコードを使用できます。