Временные таблицы в 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, вы должны удалить ваши временные таблицы -- либо до возвращения соединения с пулом (например, делая все внутри 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