PostgreSQL 12.3: ERROR: out of memory for query result

PostgreSQL 12.3: ERROR: out of memory for query result

我有一个 AWS RDS PostgreSQL 12.3(t3.small,2CPU 2GB 内存)。我有这个 table:

CREATE TABLE public.phones_infos
(
    phone_id integer NOT NULL DEFAULT nextval('phones_infos_phone_id_seq'::regclass),
    phone character varying(50) COLLATE pg_catalog."default" NOT NULL,
    company_id integer,
    phone_tested boolean DEFAULT false,
    imported_at timestamp with time zone NOT NULL,
    CONSTRAINT phones_infos_pkey PRIMARY KEY (phone_id),
    CONSTRAINT fk_phones_infos FOREIGN KEY (company_id)
        REFERENCES public.companies_infos (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE CASCADE
)

此table中正好有137468条记录,使用:

SELECT count(1) FROM phones_infos;

当我使用 pgAdmin 4.6 时,错误:查询结果内存不足

SELECT * FROM phones_infos;

我 table 有 500 万条记录,以前从未遇到过这个问题。

EXPLAIN SELECT * FROM phones_infos;
Seq Scan on phones_infos  (cost=0.00..2546.68 rows=137468 width=33)

我读了这个article to see if I could find answers, but unfortunately as we can see on metrics:没有旧的挂起的连接会占用内存。

根据建议,shared_buffers 的大小似乎正确:

SHOW shared_buffers;
449920kB

我应该尝试什么?

问题一定出在客户端。顺序扫描在 PostgreSQL 中不需要太多内存。

pgAdmin 将在 RAM 中缓存完整的结果集,这可能解释了 out-of-memory 条件。

我看到两个选项:

  • 限制 pgAdmin 中的结果行数:

    SELECT * FROM phones_infos LIMIT 1000;
    
  • 使用不同的客户端,例如 psql。在那里你可以通过设置

    来避免这个问题
    \set FETCH_COUNT 1000
    

    以便批量获取结果集。