#postgresql #out-of-memory #pgadmin #postgresql-12
#postgresql #не хватает памяти #pgadmin #postgresql-12
Вопрос:
У меня есть AWS RDS PostgreSQL 12.3 (t3.small, 2CPU 2 ГБ оперативной памяти). У меня есть эта таблица:
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
)
В этой таблице ровно 137468 записей, использующих:
SELECT count(1) FROM phones_infos;
ОШИБКА: не хватает памяти для результата запроса возникает с этим простым запросом, когда я использую pgAdmin 4.6:
SELECT * FROM phones_infos;
У меня есть таблицы с более чем 5 миллионами записей, и раньше у меня никогда не было этой проблемы.
EXPLAIN SELECT * FROM phones_infos;
Seq Scan on phones_infos (cost=0.00..2546.68 rows=137468 width=33)
Я прочитал эту статью, чтобы посмотреть, смогу ли я найти ответы, но, к сожалению, как мы можем видеть по метрикам: нет старых ожидающих подключений, которые могли бы потреблять память.
Как и предполагалось, shared_buffers, похоже, имеет правильный размер:
SHOW shared_buffers;
449920kB
Что я должен попробовать?
Комментарии:
1. Это должно происходить на стороне клиента. Что вы там используете?
2. pgAdmin 4.6. Теперь, когда вы говорите, что я признаю, что у меня проблемы с тем, что pgadmin всегда теряет соединения с момента последнего обновления. Я спросил помощника в той же сети, у него есть какие-либо проблемы с этим запросом. Я пытаюсь снова установить pdagmin
3. Известно, что pgAdmin испытывает трудности с большими наборами результатов. Используйте
psql
.4. Он снова работает. У меня никогда не было проблем даже с запросом миллионов результатов. Есть ли у вас альтернатива pgAdmin? (лучший вариант)
5. Да, как я уже сказал,
psql
. Я никогда не использую другой клиент.
Ответ №1:
Проблема должна быть на стороне клиента. Последовательное сканирование не требует много памяти в PostgreSQL.
pgAdmin кэширует полный набор результатов в ОЗУ, что, вероятно, объясняет состояние нехватки памяти.
Я вижу два варианта:
-
Ограничить количество строк результатов в pgAdmin:
SELECT * FROM phones_infos LIMIT 1000;
-
Например, используйте другой клиент
psql
. Там вы можете избежать проблемы, установивset FETCH_COUNT 1000
так что результирующий набор извлекается пакетами.