Postgresql 如何使用psql处理大型结果集?

Postgresql 如何使用psql处理大型结果集?,postgresql,psql,Postgresql,Psql,我有一个查询,它给出了大约1400万行(我不知道这一点)。当我使用psql运行查询时,我的Fedora机器冻结了。同样在查询完成后,我不能再使用Fedora了,不得不重新启动我的机器。当我将标准输出重定向到文件时,Fedora也冻结了 那么,我应该如何使用psql处理大型结果集呢?psql默认情况下会在客户端内存中累积完整的结果。对于所有基于libpq的Postgres应用程序或驱动程序,这种行为都很常见。解决方案是游标-然后您只从服务器获取N行。psql也可以使用游标。您可以通过设置FETCH

我有一个查询,它给出了大约1400万行(我不知道这一点)。当我使用psql运行查询时,我的Fedora机器冻结了。同样在查询完成后,我不能再使用Fedora了,不得不重新启动我的机器。当我将标准输出重定向到文件时,Fedora也冻结了


那么,我应该如何使用psql处理大型结果集呢?

psql
默认情况下会在客户端内存中累积完整的结果。对于所有基于
libpq
的Postgres应用程序或驱动程序,这种行为都很常见。解决方案是游标-然后您只从服务器获取N行。psql也可以使用游标。您可以通过设置
FETCH\u COUNT
变量来更改它,然后它将使用具有批检索大小
FETCH\u COUNT
的游标

postgres=# \set FETCH_COUNT 1000 postgres=# select * from generate_series(1,100000); -- big query postgres=#\set FETCH_COUNT 1000 postgres=#从generate_系列(1100000)中选择*大疑问
使用光标,只需查看您的机器可以处理的行数。
explain
给出了什么?计算一行取数或所有行取数的时间?我想知道postgres计算所有行所需的时间。@ericj:explain在这种情况下是相同的-虽然可能不同-游标是为快速启动而优化的,但它是另一种情况。查询处理是不同的。您可以查看psql源代码来实现。