我正在尝试从命令行使用 转储大表的全部内容pqsl,但遇到了内存使用量上升的问题,直到进程被终止,甚至在任何数据被转储之前。
我不明白的是:为什么查询不立即返回结果,并在不耗尽内存的情况下完成?
这是对我正在尝试的确切内容的解释:
我有一张桌子,说:
CREATE TABLE big
(
id integer,
rand double precision
)
Run Code Online (Sandbox Code Playgroud)
插入大量行(5000万):
insert into big
select generate_series(1, 50000000) AS id, random();
Run Code Online (Sandbox Code Playgroud)
选择每一行的查询计划看起来像(并不奇怪):
$ psql -d big -c "explain select * from big;"
QUERY PLAN
----------------------------------------------------------------
Seq Scan on big (cost=0.00..924326.24 rows=50000124 width=12)
(1 row)
Run Code Online (Sandbox Code Playgroud)
然后我尝试将内容转储到文件:
$ psql -d big -c "select * from big;" > big.dump
Run Code Online (Sandbox Code Playgroud)
正如我上面所说,这个命令在写入任何数据之前失败,似乎是在被操作系统杀死之前占用了越来越多的内存(被“OOM 杀手”)。
注意:我知道我可以pg_dump用来完成类似的事情,但实际上,我的查询比这更复杂 - 具体来说,我想在转储时将每一行编码为 JSON。
一些配置细节: