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-несовместимость проявляется не сразу и трудно диагностируется.
Связанные понятия
Полезные ресурсы
🔤 Английские термины в этой теме
Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.
- comfortable /ˈkʌmftəbl/ «кАмфтэбл», три слога разбор: Small talk и культурные коды: how are you, weekend
- foreign /ˈfɒrɪn/ g немая, «фОрин» разбор: Термины SQL: query, join, index, transaction, deadlock
- Rust /rʌst/ «раст», не «руст» разбор: Названия инструментов: nginx, Kubernetes, Azure, sudo
- column /ˈkɒləm/ n немая разбор: Английский баз данных и бэкенда
- benefit /ˈbɛnɪfɪt/ ударение на первый слог разбор: Тикеты и user stories: As a, I want, so that
- written /ˈrɪtn/ «ритн», двойное t произносится как одно, i краткое разбор: Письменная коммуникация
- architecture /ˈɑːrkɪtɛktʃər/ ударение на первый слог, «Аркитекчер» разбор: Письменная коммуникация