[{"data":1,"prerenderedAt":157},["ShallowReactive",2],{"$fBBQ5ulyG5jVWbIBJe3r8F-kTKQKf1scMJiu0B6qzX5k":3,"$f7AVZHmPutZ23_8XKkLbDtEszKCuiY3yPjIDp9eRXGag":5,"$fHwG2VHOWhOrI0E6SkYZYhtM80K0qkue-hFwEJN3B4jM":7,"$f-POaYJCXAMzLRXAFdh56HnEMc333Nk7tY7H-QO0Glag":133},{"data":4},[],{"data":6},[],{"data":8,"meta":129},[9],{"id":10,"documentId":11,"title":12,"seo_title":13,"summary":14,"seo_description":15,"slug":16,"published_date":17,"body":18,"content":19,"createdAt":50,"updatedAt":51,"publishedAt":52,"blogauthor":53,"cover":75,"categories":118},359,"hrh0asxfdodwjoioqkqwta73","Заглядывая в будущее: Postgres 19. REPACK, SQL\u002FPGQ и умный autovacuum","PostgreSQL 19: что нового — REPACK, SQL\u002FPGQ, autovacuum","Что ждать от Postgres 19: встроенный REPACK, SQL-запросы к графам, более умный autovacuum и улучшения репликации, COPY и производительности.","Обзор беты PostgreSQL 19: REPACK CONCURRENTLY, запросы к графам свойств SQL\u002FPGQ, улучшения autovacuum, секционирования, логической репликации и COPY.","zaglyadyvaya-v-budushhee-postgres-19-repack-sql-pgq-i-umnyj-autovacuum","2026-07-21","У каждого релиза Postgres свой характер.\n\nОдни релизы строятся вокруг громкой фичи. Другие решают давнюю проблему. Третьи содержат небольшие улучшения, которые замечаешь только после обновления: повседневная работа становится проще. Почти каждый релиз также повышает производительность.\n\nВ Postgres 19 есть улучшения на любой вкус. Встроенная команда `REPACK CONCURRENTLY` упрощает обслуживание крупных рабочих баз данных. SQL-запросы к графам свойств наверняка привлекут много внимания. Логическая репликация становится полноценнее.\n\nРазработчики также улучшили `VACUUM`, `EXPLAIN`, `COPY`, секционирование, мониторинг и планировщик. Эти изменения не так заметны, но упрощают эксплуатацию рабочих систем.\n\nДо финального релиза детали могут измениться. Но бета-версия Postgres 19 уже позволяет оценить новые возможности и понять, как они повлияют на разработку и эксплуатацию систем.\n\n![]({{strapiUrl}}\u002Fuploads\u002F46b030551a942160c5b4bdfbff92b3a6_d2e8fef522.webp)\n\n\u003Ch3 id=\"repack-pryamo-iz-korobki\">REPACK прямо из коробки\u003C\u002Fh3>\n\nЕсли вы давно работаете с Postgres, то наверняка сталкивались с \"раздуванием\" таблиц. Чтобы освободить место, перезаписать таблицу или реорганизовать данные, приходилось мириться с блокировкой от `VACUUM FULL` или `CLUSTER`.\n\nЭту проблему давно решают расширения, прежде всего `pg_repack`. Их популярность подтверждает, что пользователям не хватало встроенного инструмента.\n\nPostgres 19 добавляет в ядро команду `REPACK` с поддержкой `REPACK CONCURRENTLY`.\n\nДля рабочих баз данных `REPACK CONCURRENTLY` может оказаться важнее, чем кажется по релиз ноутсам.\n\n\u003Ch3 id=\"particzionirovanie-stanovitsya-praktichnee\">Партиционирование становится практичнее\u003C\u002Fh3>\n\nРаньше партиционирование в Postgres требовало знания внутренних механизмов и подводных камней. За последние годы работать с ним стало гораздо проще.\n\nВ Postgres 19 партиции можно объединять и разделять.\n\nЭто решает важную эксплуатационную проблему. Схему партиционирования часто выбирают обладая неполной информацией. Со временем меняются нагрузка, срок хранения и объём данных. Одни партиции вырастают слишком сильно, другие остаются маленькими.\n\nРазделение и объединение партиций позволяет менять архитектуру вместе с системой.\n\n```sql\n-- Объединяем первый и второй кварталы в одну партицию\nALTER TABLE customer_orders\nMERGE PARTITIONS (orders_2026_q1, orders_2026_q2)\nINTO orders_2026_h1;\n\n-- Разделяем партицию третьего квартала на месячные интервалы\nALTER TABLE customer_orders\nSPLIT PARTITION orders_2026_q3 INTO (\n    PARTITION orders_2026_07\n        FOR VALUES FROM ('2026-07-01') TO ('2026-08-01'),\n    PARTITION orders_2026_08\n        FOR VALUES FROM ('2026-08-01') TO ('2026-09-01'),\n    PARTITION orders_2026_09\n        FOR VALUES FROM ('2026-09-01') TO ('2026-10-01')\n);\n```\n\nАрхитектура базы данных редко остаётся неизменной. Новые команды помогают адаптировать её без полной перестройки и упрощают многолетнюю эксплуатацию Postgres.\n\n\u003Ch3 id=\"postgres-19-pryamo-v-ide\">Postgres 19 прямо в IDE\u003C\u002Fh3>\n\nВстроенный DB-клиент [OpenIDE](https:\u002F\u002Fopenide.ru\u002F) уже поддерживает PostgreSQL, Oracle, MySQL и другие СУБД. Через него можно подключиться к базе, изучить структуру схемы, написать и выполнить SQL-запрос, посмотреть результат и запустить EXPLAIN. Всё происходит в той же IDE, где открыт код проекта.\n\n\u003Cvideo src=\"https:\u002F\u002Fstorage.yandexcloud.net\u002Famplicode-site\u002Farticles\u002Fdb_client_compressed.mp4\" controls muted loop playsinline width=\"100%\" poster=\"{{strapiUrl}}\u002Fuploads\u002Fcover_zaglyadyvaya_v_budushhee_postgres_19_repack_sql_pgq_i_umnyj_autovacuum_7d3fff5353.webp\" preload=\"none\">\u003C\u002Fvideo>\n\nК выходу финальной версии Postgres 19 мы добавим поддержку всех новых возможностей релиза. Команды для работы с партициями, обновлённая логическая репликация, новые функции `COPY`, SQL\u002FPGQ и другие изменения будут доступны прямо в [OpenIDE](https:\u002F\u002Fopenide.ru\u002F).\n\n\u003Ch3 id=\"logicheskaya-replikacziya-prodolzhaet-razvivatsya\">Логическая репликация продолжает развиваться\u003C\u002Fh3>\n\nЛогическая репликация остаётся одним из главных направлений разработки Postgres. Её используют для миграций, обновлений, отчётности, перемещения данных, выборочной репликации и обеспечения высокой доступности.\n\nPostgres 19 расширяет логическую репликацию сразу в нескольких направлениях.\n\n> Главное нововведение: логическая репликация теперь синхронизирует значения последовательностей между исходной и принимающей базами. Раньше данные таблиц переносились, но состояние последовательности могло отстать. После переключения база могла выдать уже занятый идентификатор. Теперь последовательности можно перенести вместе с данными.\n\nНовая настройка `ALL SEQUENCES` позволяет включить в логическую репликацию все последовательности. Postgres также сообщает об ошибках их синхронизации и корректнее обновляет конфигурацию репликации.\n\nПри репликации всех таблиц предложение `EXCEPT` позволяет указать исключения. Это упрощает распространённый сценарий: переносить почти всё, кроме нескольких таблиц.\n\nНастройка `wal_level = replica` теперь может автоматически включать логическую репликацию при необходимости. Новый параметр `effective_wal_level` показывает фактический уровень WAL. Это снижает риск ошибок в конфигурации и делает поведение Postgres понятнее.\n\nЛогическая репликация остаётся сложным инструментом. Однако с каждым релизом она всё увереннее входит в стандартный набор средств эксплуатации Postgres.\n\n\u003Ch3 id=\"autovacuum-stanovitsya-umnee-i-prozrachnee\">Autovacuum становится умнее и прозрачнее\u003C\u002Fh3>\n\nVaccum играет важную роль в работе Postgres.\n\nО внутренних механизмах можно годами не задумываться. Но раздувание таблиц, предупреждения о переполнении счётчика транзакций или снижение производительности быстро заставят в них разобраться.\n\nPostgres 19 улучшает vacuum в нескольких областях.\n\nТеперь autovacuum может использовать параллельные рабочие процессы. Их количество настраивается глобально и для отдельных таблиц. Это ускоряет обслуживание крупных таблиц и индексов.\n\n```sql\n-- Разрешаем процессам autovacuum использовать до четырёх\n-- параллельных рабочих процессов на глобальном уровне\nALTER SYSTEM SET autovacuum_max_parallel_workers = 4;\n```\n\nНовая система оценки определяет порядок обработки таблиц. Autovacuum выбирает, какая таблица требует внимания и должна обрабатываться следующей. Умная расстановка приоритетов помогает устранить проблему до того, как она приведёт к инциденту.\n\n```sql\n-- Настраиваем оценку приоритета только для этой таблицы:\n-- резко повышаем срочность очистки по вставкам (3.0),\n-- а обычную срочность очистки по обновлениям и удалениям снижаем (0.5),\n-- поскольку строки удаляются редко.\nALTER TABLE application_logs SET (\n    autovacuum_vacuum_insert_score_weight = 3.0,\n    autovacuum_vacuum_score_weight = 0.5\n);\n```\n\nПредставление `pg_stat_autovacuum_scores` показывает, как autovacuum принимает решения. Представления прогресса очистки и анализа содержат больше данных. `VACUUM VERBOSE` и журналы autovacuum сообщают об использовании памяти и параллелизме. Отдельный параметр `log_autoanalyze_min_duration` управляет журналированием автоматического анализа. В результате обслуживание стало прозрачнее.\n\nБаза данных должна не только выполнять фоновую работу, но и понятно о ней сообщать.\n\n\u003Ch3 id=\"sql-zaprosy-k-grafam-svojstv\">SQL-запросы к графам свойств\u003C\u002Fh3>\n\nОдно из самых интересных нововведений Postgres 19: SQL\u002FPGQ, то есть SQL-запросы к графам свойств.\n\nПредставление данных в виде вершин и рёбер полезно для обнаружения мошенничества, рекомендательных систем, анализа сетей, графов разрешений, цепочек поставок и организационных структур.\n\n```sql\n-- Пример графа свойств\nCREATE PROPERTY GRAPH store_graph\nVERTEX TABLES (\n    customers LABEL customer,\n    orders LABEL \"order\"\n)\nEDGE TABLES (\n    customer_orders\n        SOURCE customers\n        DESTINATION orders\n        LABEL placed_order\n);\n```\n\nНовая возможность не требует отказываться от реляционной модели. Она лишь добавляет ещё один способ выполнять запросы к существующим данным. Это очень по-постгресовски.\n\nPostgres добавляет полезные возможности без перехода на новую архитектуру. JSONB не заменил реляционные таблицы. Полнотекстовый поиск не потребовал отдельной поисковой базы для каждого сценария. Расширения не привели к необходимости создавать форк базы данных. Теперь SQL\u002FPGQ позволяет работать с реляционными данными как с графом.\n\nГлавная идея не в том, что Postgres стал графовой базой данных. Важно, что уже выбранная база получила новые возможности.\n\nРазработчики смогут использовать графовые запросы без отдельного хранилища, дополнительной синхронизации и новых компонентов для эксплуатации. Чем меньше компонентов, тем проще система и её отладка.\n\n\u003Ch3 id=\"copy-stanovitsya-eshhyo-poleznee\">COPY становится ещё полезнее\u003C\u002Fh3>\n\n`COPY` быстро и надёжно загружает и выгружает данные. Эти операции встречаются повсюду, поэтому даже небольшие улучшения заметно влияют на работу.\n\nPostgres 19 расширяет возможности `COPY`.\n\n`COPY FROM` умеет пропускать несколько строк заголовка. Это полезно для CSV-файлов с дополнительными метаданными в начале.\n\nРежим `ON_ERROR SET_NULL` заменяет недопустимые входные значения на `NULL`. Теперь не обязательно прерывать всю загрузку или заранее очищать файл.\n\n```sql\n-- Представьте файл, в котором столбец цены иногда содержат\n-- 'N\u002FA' или 'MISSING' вместо числового значения\nCOPY product_catalog (product_id, title, price_usd)\nFROM '\u002Fpath\u002Fto\u002Fdirty_products.csv'\nWITH (\n    FORMAT CSV,\n    HEADER,\n    ON_ERROR SET_NULL\n);\n```\n\n`COPY TO` может выводить данные в формате JSON, в том числе единым массивом. Команда также напрямую выгружает секционированные таблицы. Раньше для этого требовалось `COPY (SELECT ...)`.\n\n```sql\n-- Экспортируем всю таблицу напрямую в аккуратно отформатированный,\n-- корректный JSON-массив\nCOPY customers TO '\u002Fpath\u002Fto\u002Fcustomers_export.json'\nWITH (FORMAT JSON, ARRAY true);\n```\n\nКаждое из этих изменений упрощает повседневную работу с данными.\n\n\u003Ch3 id=\"uluchsheniya-sql-dlya-povsednevnoj-raboty\">Улучшения SQL для повседневной работы\u003C\u002Fh3>\n\n`GROUP BY ALL` автоматически группирует по всем выражениям целевого списка, кроме агрегатных и оконных функций. Это делает исследовательские и отчётные запросы короче.\n\n```sql\n-- Использование GROUP BY ALL\nSELECT\n    category,\n    manufacturer,\n    COUNT(*) AS total_items,\n    AVG(price) AS avg_price\nFROM inventory_products\nGROUP BY ALL;\n```\n\nФункции `lead`, `lag`, `first_value`, `last_value` и `nth_value` получили поддержку `IGNORE NULLS` и `RESPECT NULLS`. Теперь предыдущее ненулевое значение в последовательности можно получить без сложных обходных решений.\n\nКонструкция `INSERT ... ON CONFLICT DO SELECT ... RETURNING` позволяет напрямую возвращать конфликтующие строки. Это делает операции upsert гибче.\n\n```sql\nINSERT INTO tags (tag_name)\nVALUES ('postgres')\nON CONFLICT (tag_name) DO SELECT\nRETURNING tag_id;\n```\n\nPostgres также добавляет `UPDATE` и `DELETE FOR PORTION OF` для работы с временными данными. Такой синтаксис полезен во многих реальных приложениях.\n\n\u003Ch3 id=\"uluchsheniya-proizvoditelnosti-po-vsem-napravleniyam\">Улучшения производительности по всем направлениям\u003C\u002Fh3>\n\nВ Postgres 19 улучшили планировщик и исполнитель запросов. Особая благодарность Тому Лейну из Snowflake за работу над производительностью и другими компонентами.\n\nИзменения затронули антисоединения, полусоединения, свёртку констант, инкрементальную сортировку с путями добавления, обработку агрегатов до соединений, расчёт селективности соединений и статистику функций.\n\n> Главный результат: Postgres лучше распознаёт структуру типичных запросов и выполняет меньше лишней работы.\n\nЧасть агрегатов теперь обрабатывается до соединений, поэтому Postgres перебирает меньше строк. Больше вариантов `NOT IN` и `LEFT JOIN` преобразуются в эффективные антисоединения. `EXPLAIN` лучше показывает работу Memoize. Поразрядная сортировка ускоряет сортировку данных. Ограничения внешних ключей проверяются быстрее. Текстовый и CSV-ввод через `COPY FROM` может использовать SIMD-инструкции.\n\nДля этих улучшений обычно не нужно менять код приложения. Достаточно обновить Postgres, и он чаще выберет эффективный план.\n\nТакие улучшения базы данных особенно ценны.\n\n![]({{strapiUrl}}\u002Fuploads\u002F132cf1f62cca2183d1e9dc4c9dd420a1_98213fd675.webp)\n\n[OpenIDE Pro](https:\u002F\u002Fopenide.ru\u002F) позволяет разрабатывать проекты на Java, Spring, Python, Go, PHP, JavaScript и TypeScript! А полноценный [DB-клиент](https:\u002F\u002Ftelegram.me\u002Fopenide_official\u002F167), поддержка Docker и 300+ плагинов доступны абсолютно бесплатно в [маркетплейсе](https:\u002F\u002Fmarketplace.openide.ru\u002F). Пробуйте российскую IDE в деле и подписывайтесь на нас в [Telegram](https:\u002F\u002Ft.me\u002Fopenide_official) или [Max](https:\u002F\u002Fmax.ru\u002Fopenide), чтобы не пропустить свежие обновления и полезные материалы.\n\n---\n\n_Впервые опубликовано на [Хабре](https:\u002F\u002Fhabr.com\u002Fru\u002Fcompanies\u002Fhaulmont\u002Farticles\u002F1061338\u002F)._\n",[20],{"title":21,"links":22},"Содержание",[23,26,29,32,35,38,41,44,47],{"label":24,"href":25},"REPACK прямо из коробки","#repack-pryamo-iz-korobki",{"label":27,"href":28},"Партиционирование становится практичнее","#particzionirovanie-stanovitsya-praktichnee",{"label":30,"href":31},"Postgres 19 прямо в IDE","#postgres-19-pryamo-v-ide",{"label":33,"href":34},"Логическая репликация продолжает развиваться","#logicheskaya-replikacziya-prodolzhaet-razvivatsya",{"label":36,"href":37},"Autovacuum становится умнее и прозрачнее","#autovacuum-stanovitsya-umnee-i-prozrachnee",{"label":39,"href":40},"SQL-запросы к графам свойств","#sql-zaprosy-k-grafam-svojstv",{"label":42,"href":43},"COPY становится ещё полезнее","#copy-stanovitsya-eshhyo-poleznee",{"label":45,"href":46},"Улучшения SQL для повседневной работы","#uluchsheniya-sql-dlya-povsednevnoj-raboty",{"label":48,"href":49},"Улучшения производительности по всем направлениям","#uluchsheniya-proizvoditelnosti-po-vsem-napravleniyam","2026-11-12T11:26:12.588Z","2026-11-13T11:49:20.493Z","2026-11-13T11:49:20.553Z",{"id":54,"documentId":55,"firstname":56,"lastname":57,"createdAt":58,"updatedAt":59,"publishedAt":60,"slug":61,"photo":62},40,"yuewij1jc3qoxmkvsh2mpeny","Георгий","Власов","2026-02-17T11:40:25.168Z","2026-11-13T11:49:25.324Z","2026-11-13T11:49:25.371Z","georgij-vlasov",{"id":63,"documentId":64,"name":65,"alternativeText":66,"caption":66,"width":67,"height":67,"formats":66,"hash":68,"ext":69,"mime":70,"size":71,"url":72,"previewUrl":66,"provider":73,"provider_metadata":66,"createdAt":74,"updatedAt":74,"publishedAt":74,"focalPoint":66},1359,"jt1gpp4kqcyzwuwfhzj1c1vc","Gosha_ab88bd0ec5.webp",null,96,"Gosha_ab88bd0ec5_972867885d",".webp","image\u002Fwebp",2.14,"\u002Fuploads\u002FGosha_ab88bd0ec5_972867885d.webp","local","2026-11-13T11:47:15.450Z",{"id":76,"documentId":77,"name":78,"alternativeText":66,"caption":66,"width":79,"height":80,"formats":81,"hash":114,"ext":69,"mime":70,"size":115,"url":116,"previewUrl":66,"provider":73,"provider_metadata":66,"createdAt":117,"updatedAt":117,"publishedAt":117,"focalPoint":66},1270,"yu284ul943na7q6ghrzyixlf","cover-zaglyadyvaya-v-budushhee-postgres-19-repack-sql-pgq-i-umnyj-autovacuum.webp",1731,909,{"thumbnail":82,"large":90,"medium":98,"small":106},{"name":83,"hash":84,"ext":69,"mime":70,"path":66,"width":85,"height":86,"size":87,"sizeInBytes":88,"url":89},"thumbnail_cover-zaglyadyvaya-v-budushhee-postgres-19-repack-sql-pgq-i-umnyj-autovacuum.webp","thumbnail_cover_zaglyadyvaya_v_budushhee_postgres_19_repack_sql_pgq_i_umnyj_autovacuum_7d3fff5353",245,129,4.21,4212,"\u002Fuploads\u002Fthumbnail_cover_zaglyadyvaya_v_budushhee_postgres_19_repack_sql_pgq_i_umnyj_autovacuum_7d3fff5353.webp",{"name":91,"hash":92,"ext":69,"mime":70,"path":66,"width":93,"height":94,"size":95,"sizeInBytes":96,"url":97},"large_cover-zaglyadyvaya-v-budushhee-postgres-19-repack-sql-pgq-i-umnyj-autovacuum.webp","large_cover_zaglyadyvaya_v_budushhee_postgres_19_repack_sql_pgq_i_umnyj_autovacuum_7d3fff5353",1000,525,19.18,19178,"\u002Fuploads\u002Flarge_cover_zaglyadyvaya_v_budushhee_postgres_19_repack_sql_pgq_i_umnyj_autovacuum_7d3fff5353.webp",{"name":99,"hash":100,"ext":69,"mime":70,"path":66,"width":101,"height":102,"size":103,"sizeInBytes":104,"url":105},"medium_cover-zaglyadyvaya-v-budushhee-postgres-19-repack-sql-pgq-i-umnyj-autovacuum.webp","medium_cover_zaglyadyvaya_v_budushhee_postgres_19_repack_sql_pgq_i_umnyj_autovacuum_7d3fff5353",750,394,13.91,13908,"\u002Fuploads\u002Fmedium_cover_zaglyadyvaya_v_budushhee_postgres_19_repack_sql_pgq_i_umnyj_autovacuum_7d3fff5353.webp",{"name":107,"hash":108,"ext":69,"mime":70,"path":66,"width":109,"height":110,"size":111,"sizeInBytes":112,"url":113},"small_cover-zaglyadyvaya-v-budushhee-postgres-19-repack-sql-pgq-i-umnyj-autovacuum.webp","small_cover_zaglyadyvaya_v_budushhee_postgres_19_repack_sql_pgq_i_umnyj_autovacuum_7d3fff5353",500,263,9.19,9186,"\u002Fuploads\u002Fsmall_cover_zaglyadyvaya_v_budushhee_postgres_19_repack_sql_pgq_i_umnyj_autovacuum_7d3fff5353.webp","cover_zaglyadyvaya_v_budushhee_postgres_19_repack_sql_pgq_i_umnyj_autovacuum_7d3fff5353",44.38,"\u002Fuploads\u002Fcover_zaglyadyvaya_v_budushhee_postgres_19_repack_sql_pgq_i_umnyj_autovacuum_7d3fff5353.webp","2026-11-13T11:45:09.705Z",[119],{"id":120,"documentId":121,"title":122,"published":123,"weight":124,"slug":125,"createdAt":126,"updatedAt":127,"publishedAt":128,"color":66},5,"j3ptvz8nc7ijk3w80s01koxc","Обзоры",true,4,"reviews","2026-11-12T11:20:31.440Z","2026-11-12T11:22:44.313Z","2026-11-12T11:22:44.297Z",{"pagination":130},{"page":131,"pageSize":132,"pageCount":131,"total":131},1,25,{"data":134,"meta":153},[135,141,147],{"published_date":136,"id":137,"documentId":138,"title":139,"slug":140},"2026-07-10",348,"vtjvnrwjysp7pg2m5yplwrr5","TypeScript 7.0 — самое радикальное обновление за 10 лет","typescript-7-0-samoe-radikalnoe-obnovlenie-za-10-let",{"published_date":142,"id":143,"documentId":144,"title":145,"slug":146},"2026-07-07",355,"szopwdkqo292rl7vrla29h52","Ленивые импорты в Python 3.15: как PEP 810 ускоряет старт приложений","lenivye-importy-v-python-3-15-kak-pep-810-uskoryaet-start-prilozhenij",{"published_date":148,"id":149,"documentId":150,"title":151,"slug":152},"2026-06-30",346,"lhti4xw476nf25v1qburi3pg","PHP 8.6: дата релиза, предстоящие возможности и статус RFC","php-8-6-data-reliza-predstoyashhie-vozmozhnosti-i-status-rfc",{"pagination":154},{"page":131,"pageSize":155,"pageCount":155,"total":156},3,7,1794584602153]