English version: README_EN.md
fasttrun - расширение для PostgreSQL 16, PostgreSQL 17 и PostgreSQL 18. Оно ускоряет повторяющийся цикл работы с временными таблицами:
- очистить таблицу
- заполнить ее заново
- обновить статистику для планировщика
- выполнить расчет
Для этого цикла есть две функции:
fasttruncate()очищает локальную временную таблицу.fasttrun_analyze()обновляет оценки планировщика после ее заполнения.
Обычные TRUNCATE и ANALYZE уведомляют другие серверные процессы
PostgreSQL об изменениях системного каталога и файлов отношений. При высокой
конкуренции такие уведомления могут создавать заметную нагрузку на CPU.
fasttrun выполняет основную работу только в текущем серверном процессе и в
стандартном режиме не отправляет общих сообщений инвалидации.
Нагрузка на CPU рабочего кластера до и после внедрения:
Это конкретный случай, а не гарантия такого же результата на другой системе.
Установка расширения сама по себе ничего не ускоряет. Приложение должно явно вызывать функции 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_configCREATE 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 | Проверки и релизный прогон |

