ClickHouse и расширения PostgreSQL на C++

Тема дорожной карты · Modern C++ Developer

Две крупнейшие open-source СУБД, с которыми сталкивается C++-разработчик в России, — ClickHouse и PostgreSQL. ClickHouse целиком написан на современном C++ и является одним из лучших примеров высокопроизводительного кода, доступного для чтения. PostgreSQL написан на C, но его система расширений позволяет подключать модули на C++ — так устроены PostGIS, TimescaleDB и десятки внутренних инструментов компаний. Умение работать с обеими кодовыми базами открывает вакансии в командах разработки СУБД, аналитических платформ и инфраструктуры данных.

Как это работает

ClickHouse — колоночная СУБД с векторизованным исполнением. Данные обрабатываются не по строкам, а блоками: столбец представлен классом IColumn с конкретными реализациями (ColumnVector<UInt64>, ColumnString), а функции наследуются от IFunction и получают на вход целый блок значений. Такая модель позволяет компилятору генерировать SIMD-инструкции и минимизировать промахи кэша. Добавить в ClickHouse собственную функцию означает написать класс, реализующий executeImpl, и зарегистрировать его в фабрике. Хранилище MergeTree, компрессия кодеками LZ4 и ZSTD, конвейер запросов на основе IProcessor — всё это доступно как обычный C++ с шаблонами и std:: контейнерами.

Расширение PostgreSQL — это разделяемая библиотека, которую сервер загружает через CREATE EXTENSION. Точкой входа служат функции с макросом PG_FUNCTION_INFO_V1, а память выделяется через palloc в контекстах, которые сервер освобождает сам по завершении запроса. Писать расширение на C++ можно, но границу нужно оборачивать в extern "C" и не пропускать исключения в сервер: PostgreSQL использует longjmp для обработки ошибок, и любой C++-объект с деструктором на стеке между PG_TRY и PG_CATCH останется неразрушенным. Библиотека pgrx решает это для Rust, а для C++ применяют обёртки вроде pgxx или дисциплину «тонкий C-слой снаружи, C++ внутри».

Когда применять

Вклад в ClickHouse или его форк нужен, когда компания строит аналитическую платформу и упирается в отсутствие конкретной функции, формата или движка таблиц. Чтение кода ClickHouse полезно и без вклада: там показано, как писать быстрый C++ на практике. Расширение PostgreSQL пишут, когда нужны новые типы данных, индексы, агрегаты или интеграция с внешним хранилищем через foreign data wrapper. Если задача решается SQL-функцией или PL/pgSQL, расширение на C++ — избыточная сложность.

Типичные ошибки

В ClickHouse новички пишут функции с обработкой по одному значению внутри цикла с виртуальными вызовами, теряя всю выгоду векторизации; правильный путь — специализация по типу столбца. В расширениях PostgreSQL главная ошибка — вызов new или std::vector в памяти, живущей дольше запроса, и утечка после MemoryContextReset. Вторая — пропуск C++-исключения через границу extern "C", что приводит к падению всего backend-процесса, а не одного запроса. Третья — сборка расширения с другой версией компилятора или флагами, чем сервер: ABI-несовместимость проявляется не сразу и трудно диагностируется.

Связанные понятия

Полезные ресурсы

🔤 Английские термины в этой теме

Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.

Весь словарь терминов →