Временные таблицы в PostgreSQL

мне нужно выполнить запрос в 2,5 миллиона раз. Этот запрос генерирует некоторые строки, которые мне нужно AVG(column) а затем используйте это AVG для фильтрации таблицы от всех значений ниже среднего. Мне тогда нужно INSERT эти отфильтрованные результаты в таблицу.

единственный способ сделать такую вещь с разумной эффективностью, кажется, путем создания TEMPORARY TABLE для каждого запроса-postmaster python-thread. Я просто надеюсь, что эти TEMPORARY TABLEs не будет сохраняться на жестком диске (вообще) и будет оставайтесь в памяти (ОЗУ), если, конечно, у них нет рабочей памяти.

Я хотел бы знать, будет ли временная таблица записывать записи на диск (что помешает вставкам, т. е. замедлит весь процесс)

2 ответов


обратите внимание, что в Postgres поведение по умолчанию для временных таблиц заключается в том, что они не удаляются автоматически, а данные сохраняются при фиксации. См.ON COMMIT.

временная таблица, однако,упало в конце сеанса базы данных:

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

есть несколько соображений, которые вы должны принять во внимание:

  • если вы хотите явно DROP временная таблица в конце транзакции, создайте ее с помощью CREATE TEMPORARY TABLE ... ON COMMIT DROP синтаксис.
  • при наличии подключения пула, сеанс базы данных может охватывать несколько сеансов клиента; чтобы избежать столкновений в CREATE, вы должны удалить свои временные таблицы - либо до возвращения соединения в пул (например, делая все внутри транзакция и использование ON COMMIT DROP синтаксис создания), или по мере необходимости (перед любым CREATE TEMPORARY TABLE заявление с соответствующим DROP TABLE IF EXISTS, который имеет преимущество также работать вне транзакций, например, если соединение используется в режиме автоматической фиксации.)
  • пока временная таблица в пользе, сколько из ее приспособит в память перед переполнять дальше к диску? Вижу temp_buffers на postgresql.conf
  • что-нибудь еще я должен беспокоиться при работе часто с временными таблицами? Вакуум рекомендуется после того, как вы сбросили временные таблицы, чтобы очистить любые мертвые кортежи из каталога. Postgres будет автоматически пылесосить каждые 3 минуты или около того для вас при использовании настроек по умолчанию (auto_vacuum).

кроме того, не связано с вашим вопросом (но, возможно, связано с вашим проектом): имейте в виду, что, если вам нужно запускать запросы к временной таблице после вы заполнили его, тогда это хорошая идея создать соответствующие индексы и выдает ANALYZE на таблице temp в вопросе после вы закончили вставлять в него. По умолчанию оптимизатор на основе затрат предполагает, что вновь созданная временная таблица имеет ~1000 строк, и это может привести к низкой производительности, если временная таблица действительно содержит миллионы строк.


временные таблицы предоставляют только одну гарантию-они удаляются в конце сеанса. Для небольшой таблицы у вас, вероятно, будет большая часть ваших данных в резервном хранилище. Для большой таблицы я гарантирую, что данные будут периодически сбрасываться на диск, так как компонент database engine нуждается в большем рабочем пространстве для других запросов.

изменить: Если вы абсолютно нуждаетесь в RAM-только временных таблицах, вы можете создать табличное пространство для своей базы данных на диске RAM (/dev/shm works). Этот уменьшает объем ввода-вывода диска, но будьте осторожны, что в настоящее время это невозможно сделать без записи на физический диск; ядро БД очистит список таблиц до стабильного хранилища при создании временной таблицы.