Skip to content
 
 

Repository files navigation

fasttrun

English version: README_EN.md

fasttrun - расширение для PostgreSQL 16, PostgreSQL 17 и PostgreSQL 18. Оно ускоряет повторяющийся цикл работы с временными таблицами:

  1. очистить таблицу
  2. заполнить ее заново
  3. обновить статистику для планировщика
  4. выполнить расчет

Для этого цикла есть две функции:

  • fasttruncate() очищает локальную временную таблицу.
  • fasttrun_analyze() обновляет оценки планировщика после ее заполнения.

Обычные TRUNCATE и ANALYZE уведомляют другие серверные процессы PostgreSQL об изменениях системного каталога и файлов отношений. При высокой конкуренции такие уведомления могут создавать заметную нагрузку на CPU. fasttrun выполняет основную работу только в текущем серверном процессе и в стандартном режиме не отправляет общих сообщений инвалидации.

Нагрузка на CPU рабочего кластера до и после внедрения:

CPU до fasttrun

CPU после fasttrun

Это конкретный случай, а не гарантия такого же результата на другой системе.

Установка расширения сама по себе ничего не ускоряет. Приложение должно явно вызывать функции fasttrun вместо штатных команд.

Кому подходит

fasttrun стоит рассматривать, если:

  • приложение многократно переиспользует локальные временные таблицы
  • одновременно работают десятки длительно живущих серверных соединений
  • обычные TRUNCATE и ANALYZE создают измеримую нагрузку
  • приложение можно изменить так, чтобы оно явно вызывало функции fasttrun
  • данные временной таблицы не требуется восстанавливать после ROLLBACK

Типичный сценарий - крупные PL/pgSQL-расчеты через пулер соединений. Backend PostgreSQL, то есть серверный процесс одного физического соединения, живет долго, обслуживает много клиентов и постепенно накапливает временные таблицы для повторного использования.

fasttrun не нужен, если обычные TRUNCATE и ANALYZE не создают заметной нагрузки. Сначала подтвердите проблему измерениями на своей системе.

Главное до внедрения

  • fasttruncate() не транзакционна: после начала физической очистки ROLLBACK не вернет прежние данные.
  • Расширение работает с самостоятельными локальными временными heap-таблицами. Внешние ключи не проверяются, CASCADE, TRUNCATE-триггеры и сброс последовательностей не выполняются.
  • После каждого повторного заполнения вызывайте fasttrun_analyze().
  • Если очистка сорвалась после изменения файлов, таблица блокируется с SQLSTATE 55000, пока ее не восстановят, см. восстановление после ошибки.
  • fasttrun не является границей безопасности между клиентами пулера.

Полный список проверок и ограничений - в limitations.md.

Быстрый старт

make PG_CONFIG=/path/to/pg_config
make install PG_CONFIG=/path/to/pg_config
CREATE EXTENSION fasttrun;

CREATE TEMP TABLE temp_work (id bigint, value numeric);

SELECT fasttruncate('pg_temp.temp_work');
INSERT INTO temp_work SELECT n, n * 1.5 FROM generate_series(1, 10000) AS g(n);
SELECT fasttrun_analyze('pg_temp.temp_work');
-- Рабочие запросы к temp_work.

Основным функциям не нужны ни рестарт PostgreSQL, ни shared_preload_libraries: библиотека загрузится при первом вызове. Чтобы износ статистики от UPDATE считался по колонкам, клиентским сеансам нужна предзагрузка session_preload_libraries = 'fasttrun', подробности - в statistics.md. Права, установка в отдельную схему и обновление описаны в install.md.

Документация

Документ Что внутри
install.md Сборка, права, проверка установки, обновление, удаление, совместимость
usage.md Шаблоны для SQL и PL/pgSQL, работа через пулер, функции, восстановление после ошибки
statistics.md Как обновляется статистика, параметры, память
tracking.md Учет CREATE TEMP TABLE и предварительное создание таблиц
limitations.md Что проверить до внедрения, известные ограничения
internals.md Внутреннее устройство, производительность, файловая структура
testing.md Проверки и релизный прогон

About

PostgreSQL extension for non-transactional fast truncation + fast analyze of temporary tables without pg_class bloat and sinval

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages