На прошлой неделе я провел три дня в Нидерландах и выступил с двумя докладами на двух конференциях: блиц-доклад на PGDay Lowlands в Утрехте в четверг, 10 сентября, и сессия на Percona Live в Амстердаме в пятницу, 11 сентября. В этом посте я поделюсь своими заметками с обоих мероприятий.
Как это часто бывает с конференциями (да и с любыми крупными событиями), перед тем как мы смогли туда попасть, пришлось преодолеть небольшое препятствие. В среду, 9 сентября, всего за день до PGDay Lowlands, общенациональная 24-часовая забастовка работников общественного транспорта остановила поезда, автобусы, трамваи и метро по всей стране. Не самая лучшая разминка для конференции, привлекающей людей со всего мира, но к утру четверга движение возобновилось, и день прошел по плану. Ура!
PGDay Lowlands — это однодневная голландская конференция по PostgreSQL (хотя все доклады проходят на английском языке), организованная PostgreSQL Europe. Это был третий выпуск, и мероприятие постоянно меняет локацию: в прошлом году оно проходило в зоопарке Blijdorp в Роттердаме, а в этом году — в TivoliVredenburg, концертном зале в центре Утрехта, где основной поток проходил в зале под названием Cloud Nine.
В прошлом году я выступал с полноценным 45-минутным докладом «Анатомия блокировок уровня таблицы в PostgreSQL», который стал довольно известным (запись есть на YouTube). В этом году я выбрал противоположный формат: пятиминутный блиц-доклад. Это формат, который дается мне сложнее всего, но я все равно решил попробовать.
Пять минут — это очень мало, поэтому я сосредоточился на двух open-source расширениях (pg_clickhouse и pg_stat_ch), которые мы поддерживаем в ClickHouse, оба под лицензией Apache 2.0. Идея обоих заключается в том, чтобы оставить Postgres в качестве «входной двери» и основной системы учета, а ClickHouse использовать для выполнения тяжелых аналитических задач.
Личное примечание: это было мое первое выступление в качестве нового сотрудника ClickHouse 😀 Фото: Tom
pg_clickhouse — это foreign data wrapper. Вы выполняете CREATE SERVER, указывая на ClickHouse, добавляете USER MAPPING с учетными данными и IMPORT FOREIGN SCHEMA: таблицы ClickHouse появляются как внешние таблицы в выбранной вами схеме Postgres с теми же именами столбцов и типами ClickHouse, отображенными на типы Postgres. Измените search_path на эту схему, и существующие запросы на чтение, ORM и дашборды будут работать без изменений. Там, где запрос можно передать (pushdown), планировщик Postgres отправляет его целиком в ClickHouse в виде SQL-запроса ClickHouse и получает агрегированный результат; в противном случае он передает то, что может, а остальное выполняет локально.
Смысл pg_clickhouse прост: перенос данных в ClickHouse — это легко, а переписывание SQL-запросов, накопленных за годы работы дашбордов и ORM, — сложно. Расширение позволяет существующим запросам PostgreSQL выполняться в ClickHouse, поэтому улучшение механизма pushdown является главным приоритетом в дорожной карте. Сегодня 15 из 22 запросов TPC-H при масштабном коэффициенте 1 полностью передаются в ClickHouse.
Главный слайд из блиц-доклада: Аналитика, не покидая Postgres
pg_stat_ch работает в обратном направлении. Хуки Postgres перехватывают каждое выполнение запроса как необработанное событие (время, буферы, WAL, CPU, ошибки, приложение, клиент), записывают его в кольцевой буфер в разделяемой памяти, а фоновый процесс (background worker) сбрасывает пакеты в ClickHouse по нативному протоколу, где и происходит агрегация. Он использует тот же query_id, что и pg_stat_statements, поэтому они коррелируют, но вы получаете историю по каждому запросу, которую можно сегментировать по времени и приложению, с реальными процентилями и отслеживанием ошибок. pg_stat_statements не может этого дать, так как хранит только накопительные счетчики. По дизайну здесь нет обратного давления (back-pressure): если ClickHouse работает медленно или недоступен, события отбрасываются и учитываются, а Postgres никогда не ждет.
Блиц-доклады очень интересно смотреть, поэтому я остался на весь блок.
В аудитории во время блиц-докладов. Посмотрите, как я счастлив 😀 Фото: Tom
Корнелия Бьяксич открыла блок докладом «Моя катастрофа с блиц-докладом», вспоминая свой первый опыт выступлений ровно год спустя. Это также стало напоминанием о том, что пятиминутный формат преподносится как легкий вход для новых спикеров, но он не лишен рисков, особенно для интровертов. Как экстраверт, я могу подтвердить, что это САМЫЙ сложный формат и для меня, как я упоминал выше. Эллерт ван Коперен показал реальный случай, когда партиционирование — стандартный ответ на проблему «таблица продолжает расти» — привело к побочным эффектам с серьезными последствиями, и простое решение, которое это исправило. Ян Веремьевич рассказал о статусе pg_tde: что работает сегодня, что еще предстоит сделать и как принять участие. А Дэйв Питтс завершил блок чем-то совершенно иным: историей создания песен для конференции PGDay Lowlands, которые были записаны с помощью цифровых инструментов и настоящего фортепиано, а не сгенерированы ИИ. Да, у этой конференции есть свой саундтрек!
Весь день велась прямая трансляция и велась запись, отдельные доклады будут доступны для просмотра позже.
Перед обедом я посетил доклад Майкла Банка «Подсказки оптимизатора в PostgreSQL», и он мне очень понравился. Известно, что Postgres десятилетиями отказывался добавлять подсказки оптимизатора на том основании, что проблемы планировщика — это баги, которые нужно исправлять. Майкл рассказал о том, что можно сделать сегодня: параметры enable_* (переработанные в PostgreSQL 18 так, что отключенные типы узлов учитываются, а не штрафуются огромной стоимостью) и pg_hint_plan с его комментариями /*+ ... */ и таблицей подсказок, индексируемой по ID запроса.
Больше всего меня заинтересовали два новых модуля contrib в PostgreSQL 19 от Роберта Хааса: pg_plan_advice и pg_stash_advice. Они направлены на стабилизацию плана, а не на подсказки в классическом понимании.
EXPLAIN (PLAN_ADVICE) выводит компактную «строку совета», описывающую полученный план (порядок соединения, методы соединения, методы сканирования, параллелизм). Вы можете передать эту строку обратно через pg_plan_advice.advice, чтобы закрепить план, а pg_stash_advice сохраняет советы по каждому ID запроса в разделяемой памяти, поэтому они применяются автоматически и сохраняются после переподключений и перезапусков.
Реализация работает путем ограничения планировщика, а не его замены, поэтому вы всегда можете получить только тот план, который планировщик в любом случае рассматривал бы. Аргумент Майкла заключался в том, что «перескоки» планов (plan flips) — это реальная проблема, и стабильные планы часто стоят небольшой потери производительности. Его слайды стоит прочитать.
Из Утрехта я отправился прямо в Амстердам на ужин спикеров Percona Live в четверг вечером. Это был приятный способ приехать на конференцию (я участвовал впервые): сначала познакомиться с другими спикерами за ужином, а на следующее утро прийти, уже зная несколько лиц.
Ужин спикеров Percona Live в De Bekeerde Suster — найдите меня, внимательно слушающего Аластера Тернера 🙂
Percona Live 2026 проходила с 9 по 11 сентября в отеле Mövenpick Hotel Amsterdam City Centre. Это мультибазовая конференция с потоками по MySQL, PostgreSQL, MongoDB и Valkey, что обеспечивает более широкую аудиторию, чем на PGDay. Я был там только в последний день.
Заключительное утро началось с беседы у камина под названием «Революция колоночных хранилищ», модератором которой выступил основатель Percona Питер Зайцев, а участниками — технический директор ClickHouse Алексей Миловидов и сооснователь DuckDB Ханнес Мюляйзен. Они обсудили возрождение колоночно-ориентированных баз данных и их значение для современных рабочих нагрузок.
Я не знал, что там будет наш технический директор Алексей Миловидов, пока Питер Зайцев не сказал мне об этом на ужине для спикеров, так что это стало приятным сюрпризом.
Моя сессия была 30-минутной версией доклада, который я представлю на PGConf.EU в октябре.
Я разделил изменения на пять частей:
- Логирование: log_lock_waits теперь включен по умолчанию, log_min_messages поддерживает разные уровни логирования для каждого типа процесса, логирование autoanalyze теперь отделено от autovacuum с помощью log_autoanalyze_min_duration, а сообщения от удаленных серверов через репликацию, postgres_fdw или dblink теперь форматируются так же, как локальные.
- WAL и I/O: новый счетчик wal_fpi_bytes появился в pg_stat_wal, статистике по бэкендам, строках логов VACUUM и ANALYZE, а также в EXPLAIN (ANALYZE, WAL). У операций COPY TO / FROM для файлов, каналов и программ теперь есть собственные события ожидания.
- WAIT FOR: новая команда для обеспечения семантики «чтение после записи» (read-your-writes) на асинхронных репликах с событиями ожидания для этапов записи, сброса и воспроизведения WAL.
- Новые системные представления: pg_stat_lock, pg_stat_recovery и pg_stat_autovacuum_scores.
- Multixacts и переполнение (wraparound): новая функция pg_get_multixact_stats(), а порог предупреждения о переполнении XID увеличен с 40 миллионов до 100 миллионов транзакций.
В завершение я рассказал о том, что уже закоммичено для PostgreSQL 20 (pg_stat_get_backend_lock(), которая предоставляет pg_stat_lock для каждого бэкенда). Я также затронул статистику событий ожидания, где дискуссия в списке рассылки hackers все больше склоняется к сэмплированию вместо счетчиков.
Если вам нужна полная версия, большая ее часть уже описана в трех моих статьях: «Что нового в мониторинге PostgreSQL 19», «Чтение после записи: WAIT FOR в PostgreSQL 19» и «Новые системные представления в PostgreSQL 19».
Оба мероприятия вернутся в 2027 году, даты и места проведения будут объявлены позже.
Спасибо всем, кто сделал PGDay Lowlands возможным: Флор Дрис, Дерк ван Вин, Тереза Лопес, Борис Мехиас, Сара Конуэй, Стейси Распопина, Йос ван Схаутен, Челси Доул, Стефан Ферко и Эллерт ван Коперен. Также спасибо Питеру Зайцеву, Аластеру Тернеру, Яну Веремьевичу и Каю Вагнеру из команды Percona за приглашение, а также всем, кто пришел на мои доклады. Увидимся в Валенсии!









