Временные таблицы PostgreSQL - PullRequest
65 голосов
/ 28 января 2009

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

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

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

Ответы [ 2 ]

101 голосов
/ 17 февраля 2009

Обратите внимание, что в 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
  • Что еще мне следует беспокоиться при частой работе с временными таблицами? После того, как у вас есть DROPped временные таблицы, рекомендуется очистить, чтобы убрать все мертвые кортежи из каталога. Postgres будет автоматически пылесосить каждые 3 минуты или около того при использовании настроек по умолчанию (auto_vacuum).

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

15 голосов
/ 28 января 2009

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

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

...