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



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



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



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

1312   2  

2 ответов:

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.