PostgreSQL 12.3: ОШИБКА: не хватает памяти для результата запроса

#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
      

    так что результирующий набор извлекается пакетами.