TGViewer
Алексей Рыбак: системный дизайн, хайлоад, разработка с агентами Алексей Рыбак: системный дизайн, хайлоад, разработка с агентами @rybakalexey · 10.3K subscribers
Post #549 4.62K
PostgreSQL 19 IV: REPACK

Традиционно каждую осень выходит очередная мажорная версия СУБД PostgreSQL. Что нам готовит 19я версия — рассказываем с нашим экспертом по СУБД и автором курса по архитектуре и тюнингу SQL в PostgreSQL, Николаем Ихалайненом. В прошлых выпусках смотрели на нововведения для разработки, теперь настала очередь новинок для администрирования.

В PostgreSQL 19 появляется новая команда REPACK, которая предназначена для физической перепаковки таблиц. Она помогает устранить bloat, то есть избыточно занятое место, которое накапливается после большого количества операций UPDATE и DELETE.

REPACK не меняет сам принцип работы таких операций. PostgreSQL по-прежнему создает новую физическую копию таблицы, переносит в нее актуальные версии строк, пересоздает индексы, а затем заменяет старые файлы новыми. Именно за счет этого таблица становится компактнее, а неиспользуемое пространство может быть возвращено операционной системе.

Раньше похожие задачи решались с помощью команд VACUUM FULL и CLUSTER. VACUUM FULL использовался для освобождения места на диске, а CLUSTER — для физического упорядочивания строк таблицы по индексу. Однако обе операции требуют сильной блокировки таблицы, что особенно проблематично для крупных и активно используемых таблиц.

REPACK объединяет эти сценарии в одной команде. При обычном запуске он также блокирует таблицу, но при использовании опции CONCURRENTLY основная часть работы выполняется без длительной блокировки чтения и записи. Сильная блокировка все равно требуется, но обычно только на коротком финальном этапе, когда PostgreSQL заменяет старые файлы таблицы и индексов новыми.

Пример перепаковки таблицы в конкурентном режиме:


REPACK (CONCURRENTLY) orders;


В этом примере таблица orders переписывается в более компактном виде. Для пользователей и приложений это означает, что таблица в основном остается доступной во время операции, хотя кратковременная блокировка на финальном этапе все равно возможна.

Если необходимо не только убрать bloat, но и физически упорядочить строки таблицы по определенному индексу, можно использовать вариант с USING INDEX:


REPACK orders USING INDEX orders_order_date_idx;


Такой вариант близок по смыслу к CLUSTER: строки таблицы будут расположены в порядке, заданном индексом orders_order_date_idx, например по дате заказа.

После выполнения REPACK обычно нет необходимости дополнительно запускать VACUUM FULL или CLUSTER для той же таблицы. REPACK уже выполняет соответствующую физическую работу: уменьшает bloat, пересоздает индексы и, при использовании USING INDEX, упорядочивает строки по индексу.

Прошлые выпуски: PG19-I, PG19-II и PG19-III
  • 🔥 31
  • 👍 15
  • 💯 4
More from @rybakalexey
  1. Sep 24, 2026Алексей Рыбак: системный дизайн, хайлоад, разработка с агентами pinned a photo
  2. Sep 24, 2026Devhands — обучение в октябре Раз в месяц мы постим анонсы курсов и митапов, чтобы вы или…
  3. Sep 22, 2026На прошлой неделе я написал пост про “высокомерную иронию”, и всем спасибо, кто проголосов…
  4. Sep 21, 2026Пошаговый план для запуска убыточного B2B SaaS • Найди уникальную идею, не имеющую аналого…
  5. Sep 19, 2026Высокомерная ирония как управленческий инструмент: колхозная токсичность или шоковая терап…
  6. Sep 18, 2026Тусовка, всем привет от Игоря Сысоева! Вы же знаете, кто это такой, а фронтенд это не толь…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →