NPGSQL:从 Postgres 查询流式传输结果?

Ala*_*lan 2 .net postgresql select npgsql

我有一个大表(2,000,000 行),我想将每条记录打印到屏幕上,一次一个,而不将整个表加载到内存中。

//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

}
Run Code Online (Sandbox Code Playgroud)

正如上面代码中所指出的,在整个集合加载到内存中之前,ExecuteReader() 不会继续。我如何改变这种行为以便结果被流式传输?

谢谢

ETA:虽然这看起来像是家庭作业,但事实并非如此。这只是描述问题的一种更简单的方法,该问题涉及使用单个查询读取整个表,但一次处理一行结果。

预计到达时间 x2:

来自 npgsql 警告:调用 ExecuteReader 和大型表时存在一个已知问题。当前Npgsql 的版本 1 在返回之前从表中获取所有数据。如果在这种情况下遇到性能不佳的情况,您可能需要使用服务器游标来分页浏览行。为此,您可以使用如下代码:

Fra*_*ior 5

Npgsql2 现在可以更好地处理大型结果集。它不会将所有数据加载到内存中。因此,您不再需要使用服务器端光标。

我希望它有帮助。

Francisco Figueiredo Jr. Npgsql 首席开发人员