Справочная документация по pg_clickhouse
Описание
pg_clickhouse — это расширение PostgreSQL, позволяющее удалённо выполнять запросы к базам данных ClickHouse, включая реализацию [обёртки внешних данных (foreign data wrapper)]. Оно поддерживает PostgreSQL 13 и новее и ClickHouse 23 и новее.
Начало работы
Самый простой способ попробовать pg_clickhouse — использовать [образ Docker], который содержит стандартный образ PostgreSQL с расширением pg_clickhouse:
См. руководство, чтобы начать импортировать таблицы ClickHouse и пробрасывать запросы.
Использование
Политика версионирования
pg_clickhouse следует [Семантическому версионированию] для своих публичных релизов.
- Старшая версия увеличивается при изменениях API
- Младшая версия увеличивается при обратно совместимых изменениях SQL
- Патч-версия увеличивается при изменениях только на уровне бинарных файлов
После установки PostgreSQL отслеживает два варианта номера версии:
- Версия библиотеки (определяется
PG_MODULE_MAGICв PostgreSQL 18 и выше) включает полную семантическую версию, видимую в выводе функцииpg_get_loaded_modules(). - Версия расширения (определяется в control-файле) включает только старшую
и младшую версии, видимую в таблице
pg_catalog.pg_extension, в выводе функцииpg_available_extension_versions()и в\dx pg_clickhouse.
На практике это означает, что релиз, который увеличивает патч-версию, например
с v0.1.0 до v0.1.1, применяется ко всем базам данных, которые загрузили
v0.1, и им не нужно выполнять ALTER EXTENSION, чтобы получить преимущества
обновления.
Релиз, который увеличивает младшую или старшую версии, напротив, будет
сопровождаться SQL-скриптами обновления, и все существующие базы данных,
в которых установлено это расширение, должны выполнить ALTER EXTENSION pg_clickhouse UPDATE,
чтобы получить преимущества обновления.
Справочник по SQL DDL
В следующих SQL-выражениях DDL используется pg_clickhouse.
CREATE EXTENSION
Используйте CREATE EXTENSION, чтобы добавить pg_clickhouse в базу данных:
Используйте WITH SCHEMA, чтобы установить его в конкретную схему (рекомендуется):
ALTER EXTENSION
Используйте ALTER EXTENSION, чтобы изменить расширение pg_clickhouse. Примеры:
-
После установки новой версии pg_clickhouse используйте оператор
UPDATE: -
Используйте
SET SCHEMA, чтобы перенести расширение в другую схему:
DROP EXTENSION
Используйте DROP EXTENSION, чтобы удалить расширение pg_clickhouse из базы данных:
Эта команда завершится с ошибкой, если существуют какие-либо объекты, зависящие от pg_clickhouse. Используйте
предложение CASCADE, чтобы удалить и их:
CREATE SERVER
Используйте CREATE SERVER, чтобы создать внешний сервер для подключения к серверу ClickHouse. Пример:
Поддерживаемые параметры:
driver: драйвер подключения к ClickHouse, который следует использовать — либо "binary", либо "http". Обязательный.dbname: база данных ClickHouse, которая будет использоваться при подключении. По умолчанию "default".host: имя хоста сервера ClickHouse. По умолчанию "localhost".port: порт для подключения к серверу ClickHouse. Значения по умолчанию:- 9440, если
driver— "binary" иhostявляется хостом ClickHouse Cloud - 9004, если
driver— "binary" иhostне является хостом ClickHouse Cloud - 8443, если
driver— "http" иhostявляется хостом ClickHouse Cloud - 8123, если
driver— "http" иhostне является хостом ClickHouse Cloud
- 9440, если
ALTER SERVER
Используйте оператор ALTER SERVER, чтобы изменить внешний сервер. Пример:
Параметры те же, что и для CREATE SERVER.
DROP SERVER
Используйте DROP SERVER для удаления внешнего сервера:
Эта команда приведёт к ошибке, если от сервера зависят какие-либо другие объекты. Используйте CASCADE,
чтобы также удалить эти зависимости:
CREATE USER MAPPING
Используйте CREATE USER MAPPING, чтобы сопоставить пользователя PostgreSQL с пользователем ClickHouse. Например, чтобы сопоставить текущего пользователя PostgreSQL с удалённым пользователем ClickHouse при подключении к внешнему серверу taxi_srv:
Поддерживаемые параметры:
user: Имя пользователя ClickHouse. По умолчанию — "default".password: Пароль пользователя ClickHouse.
ALTER USER MAPPING
Используйте ALTER USER MAPPING, чтобы изменить определение сопоставления пользователя:
Параметры совпадают с параметрами для CREATE USER MAPPING.
DROP USER MAPPING
Используйте DROP USER MAPPING для удаления сопоставления пользователя:
IMPORT FOREIGN SCHEMA
Используйте IMPORT FOREIGN SCHEMA, чтобы импортировать все таблицы, определённые в базе данных ClickHouse, в качестве внешних таблиц в схему PostgreSQL:
Используйте LIMIT TO, чтобы импортировать только определённые таблицы:
Используйте EXCEPT для исключения таблиц:
pg_clickhouse получит список всех таблиц в указанной базе данных ClickHouse («demo» в приведённых выше примерах), получит определения столбцов для каждой из них и выполнит команды CREATE FOREIGN TABLE для создания внешних таблиц. Столбцы будут определены с использованием поддерживаемых типов данных и, где это можно определить, опций, поддерживаемых CREATE FOREIGN TABLE.
IMPORT FOREIGN SCHEMA выполняет quote_identifier() для импортируемых имён
таблиц и столбцов, что приводит к заключению в двойные кавычки идентификаторов
с прописными буквами или пробелами. Такие имена таблиц и столбцов, соответственно,
должны указываться в двойных кавычках в запросах PostgreSQL. Имена, состоящие
только из строчных букв и не содержащие пробелов, не нужно заключать в кавычки.
Например, для следующей таблицы ClickHouse:
IMPORT FOREIGN SCHEMA создаёт следующую внешнюю таблицу:`
Поэтому в запросах необходимо корректно использовать кавычки, например:
Чтобы создать объекты с другими именами или именами целиком в нижнем регистре (а значит, нечувствительными к регистру), используйте CREATE FOREIGN TABLE.
CREATE FOREIGN TABLE
Используйте CREATE FOREIGN TABLE, чтобы создать внешнюю таблицу, которая может выполнять запросы к данным в базе данных ClickHouse:
Поддерживаемые параметры таблицы:
database: Имя удалённой базы данных. По умолчанию используется база данных, определённая для внешнего сервера.table_name: Имя удалённой таблицы. По умолчанию используется имя, указанное для внешней таблицы.engine: [Движок таблицы], используемый таблицей ClickHouse. ДляCollapsingMergeTree()иAggregatingMergeTree()pg_clickhouse автоматически применяет параметры к функциональным выражениям, выполняемым над таблицей.
Используйте тип данных, соответствующий удалённому типу данных ClickHouse для каждого столбца. Для столбцов типа AggregateFunction Type и SimpleAggregateFunction Type сопоставьте тип данных с типом ClickHouse, передаваемым в функцию, и укажите имя агрегатной функции через соответствующий параметр столбца:
AggregateFunction: Имя агрегатной функции, применённой к столбцу типа AggregateFunction TypeSimpleAggregateFunction: Имя агрегатной функции, применённой к столбцу типа SimpleAggregateFunction Type
Пример:
(aggregatefunction 'sum')
Для столбцов с типом AggregateFunction pg_clickhouse автоматически добавит Merge к агрегатной функции, применяемой к этому столбцу.
ALTER FOREIGN TABLE
Используйте команду ALTER FOREIGN TABLE, чтобы изменить определение внешней таблицы:
Поддерживаемые параметры таблиц и столбцов совпадают с параметрами для CREATE FOREIGN TABLE.
DROP FOREIGN TABLE
Используйте оператор DROP FOREIGN TABLE для удаления внешней таблицы:
Эта команда завершится с ошибкой, если существуют какие-либо объекты, зависящие от внешней таблицы.
Используйте ключевое слово CASCADE, чтобы удалить и их:
Справочник по SQL DML
SQL-выражения DML, приведённые ниже, могут использовать pg_clickhouse. Примеры зависят от следующих таблиц ClickHouse, созданных скриптом make-logs.sql:
EXPLAIN
Команда EXPLAIN работает как и ожидается, но опция VERBOSE приводит к тому, что выполняется запрос ClickHouse "Remote SQL":
Этот запрос пробрасывается в ClickHouse в виде удалённого SQL через плановый узел "Foreign Scan".
SELECT
Используйте оператор SELECT для выполнения запросов к таблицам pg_clickhouse аналогично любым другим таблицам:
pg_clickhouse работает таким образом, чтобы по возможности передавать выполнение запроса в ClickHouse, включая агрегатные функции. Используйте EXPLAIN, чтобы определить степень такого делегирования. Для приведённого выше запроса, например, всё выполнение полностью передаётся в ClickHouse.
pg_clickhouse также проталкивает выполнение операций JOIN к таблицам, расположенным на том же удалённом сервере:
Выполнение JOIN с локальной таблицей приводит к менее эффективным запросам без
тщательной настройки. В этом примере мы создаём локальную копию таблицы
nodes и выполняем соединение с ней вместо удалённой таблицы:
В этом случае мы можем переложить больше работы по агрегации на ClickHouse,
выполняя группировку по node_id вместо локального столбца, а затем
выполнить JOIN с таблицей соответствия:
Узел "Foreign Scan" теперь выполняет агрегацию по node_id на удалённой стороне, уменьшая
количество строк, которые нужно вернуть в Postgres, с 1000 (всех)
до всего лишь 8, по одной на каждый узел.
PREPARE, EXECUTE, DEALLOCATE
Начиная с версии v0.1.2, pg_clickhouse поддерживает параметризованные запросы, как правило создаваемые командой PREPARE:
Используйте EXECUTE как обычно, чтобы выполнить подготовленный запрос:
pg_clickhouse, как и обычно, проталкивает агрегации на нижележащий уровень, что видно из подробного вывода EXPLAIN:
Обратите внимание, что отправлены полные значения дат, а не шаблоны параметров.
Это справедливо для первых пяти запросов, как описано в PostgreSQL
[PREPARE notes]. При шестом выполнении он отправляет в ClickHouse
параметры запроса в формате {param:type}:
параметры:
Используйте DEALLOCATE, чтобы освободить подготовленный запрос:
INSERT
Используйте команду INSERT, чтобы вставлять значения в удалённую таблицу ClickHouse:
COPY
Используйте команду COPY, чтобы вставить пакет строк в удалённую таблицу ClickHouse:
⚠️ Ограничения Batch API
В pg_clickhouse ещё не реализована поддержка PostgreSQL FDW Batch Insert API. Поэтому COPY в настоящее время использует команды INSERT для вставки записей. Это будет улучшено в одном из следующих релизов.
LOAD
Используйте LOAD, чтобы загрузить общую библиотеку pg_clickhouse:
Обычно нет необходимости использовать LOAD, так как Postgres автоматически загружает pg_clickhouse при первом использовании любой из его возможностей (функции, внешние таблицы и т. д.).
Единственный случай, когда может быть полезно выполнить LOAD для pg_clickhouse, — это задать с помощью SET параметры pg_clickhouse перед выполнением зависящих от них запросов.
SET
Используйте SET, чтобы задать параметр времени выполнения pg_clickhouse.session_settings.
Этот параметр настраивает [параметры ClickHouse], которые будут применены к последующим
запросам. Пример:
По умолчанию — join_use_nulls 1. Установите пустую строку, чтобы перейти к использованию настроек сервера ClickHouse.
Синтаксис: список пар ключ/значение, разделённых запятыми; ключ и значение в паре разделяются одним или несколькими пробелами. Ключи должны соответствовать [настройкам ClickHouse]. В значениях экранируйте пробелы, запятые и обратные косые черты с помощью обратной косой черты:
Или используйте значения в одинарных кавычках, чтобы избежать экранирования пробелов и запятых; рассмотрите возможность использования dollar quoting, чтобы избежать необходимости двойного заключения в кавычки:
Если для вас важна читаемость и нужно задать много параметров, используйте несколько строк, например:
pg_clickhouse не проверяет настройки, а передаёт их в ClickHouse для каждого запроса. Тем самым он поддерживает все настройки для каждой версии ClickHouse.
Обратите внимание, что pg_clickhouse должен быть загружен до задания
pg_clickhouse.session_settings; либо используйте [предзагрузку общей библиотеки], либо
просто используйте один из объектов расширения, чтобы гарантировать его загрузку.
ALTER ROLE
Используйте команду SET оператора ALTER ROLE для предварительной загрузки pg_clickhouse
и/или настройки его параметров для определённых ролей:
Используйте команду RESET оператора ALTER ROLE, чтобы сбросить предзагрузку pg_clickhouse и/или его параметры:
Предварительная загрузка
Если каждому или почти каждому подключению к Postgres нужно использовать pg_clickhouse, рассмотрите возможность использования [предварительной загрузки общих библиотек], чтобы он загружался автоматически:
session_preload_libraries
Загружает разделяемую библиотеку для каждого нового соединения с PostgreSQL:
Полезно, чтобы применять обновления без перезапуска сервера: достаточно просто переподключиться. Этот параметр также можно задать для отдельных пользователей или ролей с помощью ALTER ROLE.
shared_preload_libraries
Загружает общую библиотеку в родительский процесс PostgreSQL при запуске:
Полезно для экономии памяти и снижения накладных расходов на загрузку в каждом сеансе, но при обновлении библиотеки требуется перезапуск кластера.
Справочник функций и операторов
Типы данных
pg_clickhouse сопоставляет следующие типы данных ClickHouse с типами данных PostgreSQL:
| ClickHouse | PostgreSQL | Примечания |
|---|---|---|
| Bool | boolean | |
| Date | date | |
| Date32 | date | |
| DateTime | timestamp | |
| Decimal | numeric | |
| Float32 | real | |
| Float64 | double precision | |
| IPv4 | inet | |
| IPv6 | inet | |
| Int16 | smallint | |
| Int32 | integer | |
| Int64 | bigint | |
| Int8 | smallint | |
| JSON | jsonb | только для HTTP-движка |
| String | text | |
| UInt16 | integer | |
| UInt32 | bigint | |
| UInt64 | bigint | Ошибка для значений > максимального значения BIGINT |
| UInt8 | smallint | |
| UUID | uuid |
Функции
Эти функции предоставляют интерфейс для выполнения запросов к базе данных ClickHouse.
clickhouse_raw_query
Подключается к серверу ClickHouse через его HTTP‑интерфейс, выполняет один
запрос и отключается. Необязательный второй аргумент задаёт строку
подключения, по умолчанию host=localhost port=8123. Поддерживаемые
параметры подключения:
host: Хост, к которому выполняется подключение; обязательный параметр.port: HTTP‑порт для подключения; по умолчанию8123, если толькоhostне является хостом ClickHouse Cloud, — в этом случае по умолчанию используется8443dbname: Имя базы данных, к которой выполняется подключение.username: Имя пользователя, под которым выполняется подключение; по умолчаниюdefaultpassword: Пароль, используемый для аутентификации; по умолчанию пароль не используется
Полезно для запросов, которые не возвращают записей; результаты запросов, которые возвращают значения, возвращаются в виде одного текстового значения:
Функции pushdown
Все встроенные функции PostgreSQL, используемые в условных выражениях (предложения HAVING и WHERE)
для выполнения запросов к внешним таблицам ClickHouse, автоматически передаются на выполнение в ClickHouse
с теми же именами и сигнатурами. Однако у некоторых функций другие
имена или сигнатуры, и их необходимо сопоставить с их эквивалентами в ClickHouse. pg_clickhouse
сопоставляет следующие функции:
date_part:date_part('day'): toDayOfMonthdate_part('doy'): toDayOfYeardate_part('dow'): toDayOfWeekdate_part('year'): toYeardate_part('month'): toMonthdate_part('hour'): toHourdate_part('minute'): toMinutedate_part('second'): toSeconddate_part('quarter'): toQuarterdate_part('isoyear'): toISOYeardate_part('week'): toISOYeardate_part('epoch'): toISOYear
date_trunc:date_trunc('week'): toMondaydate_trunc('second'): toStartOfSeconddate_trunc('minute'): toStartOfMinutedate_trunc('hour'): toStartOfHourdate_trunc('day'): toStartOfDaydate_trunc('month'): toStartOfMonthdate_trunc('quarter'): toStartOfQuarterdate_trunc('year'): toStartOfYear
array_position: indexOfbtrim: trimBothstrpos: positionregexp_like: match
Пользовательские функции
Эти пользовательские функции, созданные pg_clickhouse, обеспечивают проталкивание (pushdown) удалённых запросов для отдельных функций ClickHouse, не имеющих эквивалентов в PostgreSQL. Если какую-либо из этих функций нельзя протолкнуть, будет возбуждено исключение.
Pushdown-приведения типов
pg_clickhouse проталкивает приведения типов, такие как CAST(x AS bigint), для совместимых
типов данных. Для несовместимых типов операция pushdown завершится ошибкой; если x в этом
примере — ClickHouse UInt64, ClickHouse откажется выполнять такое приведение.
Для того чтобы выполнять pushdown-приведения к несовместимым типам данных, pg_clickhouse предоставляет следующие функции. Они вызывают исключение в PostgreSQL, если приведение не было протолкнуто в ClickHouse.
Pushdown-агрегаты
Эти агрегатные функции PostgreSQL выполняются в ClickHouse посредством pushdown.
Пользовательские агрегаты
Эти пользовательские агрегатные функции, созданные pg_clickhouse, обеспечивают проталкивание удалённых запросов (foreign query pushdown) для отдельных агрегатных функций ClickHouse, не имеющих эквивалентов в PostgreSQL. Если какую-либо из этих функций невозможно протолкнуть, будет сгенерировано исключение.
Pushdown Ordered Set Aggregates
Эти [ordered-set aggregate functions] сопоставляются с [Parametric aggregate functions] в ClickHouse: их прямой аргумент передается как параметр, а выражения ORDER BY — как аргументы. Например, этот запрос PostgreSQL:
Соответствует следующему запросу ClickHouse:
Учтите, что явные суффиксы ORDER BY DESC и NULLS FIRST
не поддерживаются и приведут к ошибке.
percentile_cont(double): quantilequantile(double): quantilequantileExact(double): quantileExact
Автор
Авторские права
Copyright (c) 2025-2026, ClickHouse
"Документация PostgreSQL: предварительная загрузка разделяемых библиотек [PREPARE notes]: https://www.postgresql.org/docs/current/sql-prepare.html#SQL-PREPARE-NOTES "Документация PostgreSQL: примечания к PREPARE" [query parameters]: https://clickhouse.com/docs/guides/developer/stored-procedures-and-prepared-statements#alternatives-to-prepared-statements-in-clickhouse "Документация ClickHouse: альтернативы подготовленным запросам в ClickHouse"