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
以便批量获取结果集。
我有一个 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
以便批量获取结果集。