Временные таблицы в PostgreSQL
мне нужно выполнить запрос в 2,5 миллиона раз. Этот запрос генерирует некоторые строки, которые мне нужно AVG(column)
а затем используйте это AVG
для фильтрации таблицы от всех значений ниже среднего. Мне тогда нужно INSERT
эти отфильтрованные результаты в таблицу.
единственный способ сделать такую вещь с разумной эффективностью, кажется, путем создания TEMPORARY TABLE
для каждого запроса-postmaster python-thread. Я просто надеюсь, что эти TEMPORARY TABLE
s не будет сохраняться на жестком диске (вообще) и будет оставайтесь в памяти (ОЗУ), если, конечно, у них нет рабочей памяти.
Я хотел бы знать, будет ли временная таблица записывать записи на диск (что помешает вставкам, т. е. замедлит весь процесс)
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). Этот уменьшает объем ввода-вывода диска, но будьте осторожны, что в настоящее время это невозможно сделать без записи на физический диск; ядро БД очистит список таблиц до стабильного хранилища при создании временной таблицы.