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

У меня есть AWS RDS PostgreSQL 12.3 (t3.small, 2 ЦП 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

Что мне попробовать?


person IndiaSke    schedule 30.09.2020    source источник
comment
Этот OOM должен происходить на стороне клиента. Что вы там используете?   -  person Laurenz Albe    schedule 30.09.2020
comment
пгадмин 4.6. Теперь, когда вы сказали, что я признаю, что у меня есть проблемы с pgadmin, которые всегда теряют соединения с момента последнего обновления. Я спросил товарища в той же сети, что у него есть проблемы с этим запросом. Я снова пытаюсь установить pdagmin   -  person IndiaSke    schedule 30.09.2020
comment
Известно, что pgAdmin тяжело справляется с большими наборами результатов. Используйте 1_.   -  person Laurenz Albe    schedule 30.09.2020
comment
Он снова работает. У меня никогда не было проблем даже с запросом миллионов результатов. У вас есть альтернатива pgAdmin? (лучший)   -  person IndiaSke    schedule 30.09.2020
comment
Да, как я уже сказал, psql. Я никогда не пользуюсь другим клиентом.   -  person Laurenz Albe    schedule 30.09.2020
comment
@LaurenzAlbe. . . Я думаю, вы должны объединить свои комментарии в ответ.   -  person Gordon Linoff    schedule 30.09.2020
comment
Как указывает @LaurenceAlbe, psql всегда будет работать. Я предлагаю вам ознакомиться с ним. Но со стороны IDE вы можете заглянуть в DBeaver или даже (как это ни удивительно) работает разработчик Oracle SQL. Если у вас глубокие карманы, то есть Toad Edge.   -  person Belayer    schedule 30.09.2020


Ответы (1)


Проблема должна быть на стороне клиента. Последовательное сканирование не требует много памяти в PostgreSQL.

pgAdmin будет кэшировать полный набор результатов в ОЗУ, что, вероятно, объясняет состояние нехватки памяти.

Я вижу два варианта:

  • Ограничьте количество строк результатов в pgAdmin:

    SELECT * FROM phones_infos LIMIT 1000;
    
  • Используйте другой клиент, например psql. Там вы можете избежать проблемы, установив

    \set FETCH_COUNT 1000
    

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

person Laurenz Albe    schedule 30.09.2020