pg_clickhouse リファレンス ドキュメント
説明
pg_clickhouse は、foreign data wrapper を含め、ClickHouse データベースに対するリモートでのクエリ実行を可能にする PostgreSQL 拡張機能です。PostgreSQL 13 以降および ClickHouse 23 以降をサポートしています。
はじめに
pg_clickhouse を試す最も簡単な方法は、pg_clickhouse 拡張機能を組み込んだ標準 PostgreSQL の Docker image を使うことです。
ClickHouse テーブルのインポートやクエリのプッシュダウンを始めるには、チュートリアル を参照してください。
使用方法
バージョニングポリシー
pg_clickhouse は公開リリースに対して Semantic Versioning に従います。
- メジャーバージョンは API の変更時にインクリメントされます
- マイナーバージョンは後方互換性のある SQL の変更時にインクリメントされます
- パッチバージョンはバイナリのみの変更時にインクリメントされます
インストール後は、PostgreSQL は 2 種類のバージョンを追跡します。
- ライブラリバージョン(PostgreSQL 18 以上では
PG_MODULE_MAGICによって定義)は完全なセマンティックバージョンを含み、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 リファレンス
以下の SQL 文は 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 サーバーへの接続を定義する foreign server(外部サーバー)を作成します。例:
サポートされているオプションは次のとおりです:
driver: 使用する ClickHouse 接続ドライバ。"binary" または "http" のいずれか。必須。dbname: 接続時に使用する ClickHouse データベース。デフォルトでは "default"。host: ClickHouse サーバーのホスト名。デフォルトでは "localhost"。port: ClickHouse サーバーに接続するポート。デフォルトは次のとおり:driverが "binary" で、hostが ClickHouse Cloud のホストの場合は 9440driverが "binary" で、hostが ClickHouse Cloud のホストではない場合は 9004driverが "http" で、hostが ClickHouse Cloud のホストの場合は 8443driverが "http" で、hostが ClickHouse Cloud のホストではない場合は 8123
ALTER SERVER
ALTER SERVER を使用して、外部サーバーの定義を変更します。例:
オプションは CREATE SERVER の場合と同じです。
DROP SERVER
DROP SERVER を使用して、外部サーバー定義を削除します。
サーバーに他のオブジェクトが依存している場合、このコマンドは失敗します。それらの依存関係も削除するには、CASCADE 句を使用してください。
CREATE USER MAPPING
CREATE USER MAPPING を使用して、PostgreSQL ユーザーを ClickHouse ユーザーにマッピングします。
たとえば、taxi_srv フォーリンサーバーに接続する際に、現在の PostgreSQL ユーザーをリモートの ClickHouse ユーザーにマッピングするには、次のようにします。
サポートされているオプションは次のとおりです。
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 でサポートされているオプションを使用して定義されます。
CREATE FOREIGN TABLE
IMPORT FOREIGN SCHEMA を使用して、ClickHouse データベース内のデータを参照する外部テーブルを作成します。
サポートされているテーブルオプションは次のとおりです。
database: リモートデータベース名。指定がない場合は、外部サーバーに対して定義されたデータベースが使用されます。table_name: リモートテーブル名。指定がない場合は、外部テーブルに指定された名前が使用されます。engine: ClickHouse テーブルで使用される[テーブルエンジン]。CollapsingMergeTree()およびAggregatingMergeTree()の場合、pg_clickhouse はテーブル上で実行される関数式にパラメータを自動的に適用します。
各カラムのリモート ClickHouse 側のデータ型に適した data type を使用します。AggregateFunction Type および SimpleAggregateFunction Type カラムについては、データ型を関数に渡される ClickHouse の型にマッピングし、適切なカラムオプションを使用して集約関数名を指定します。
AggregateFunction: AggregateFunction Type カラムに適用される集約関数の名前SimpleAggregateFunction: SimpleAggregateFunction Type カラムに適用される集約関数の名前
例:
(aggregatefunction 'sum')
AggregateFunction 関数を持つカラムに対しては、pg_clickhouse がそのカラムを評価する集約関数に自動的に Merge を付与します。
ALTER FOREIGN TABLE
[ALTER FOREIGN TABLE] を使用すると、外部テーブルの定義を変更できます。
サポートされるテーブルおよびカラムのオプションは、[CREATE FOREIGN TABLE] の場合と同様です。
DROP FOREIGN TABLE
[DROP FOREIGN TABLE] を使用して、外部テーブルを削除します。
このコマンドは、外部テーブルに依存するオブジェクトが存在する場合は失敗します。
それらも合わせて削除するには、CASCADE 句を使用します。
関数と演算子のリファレンス
データ型
pg_clickhouse は、次の ClickHouse データ型を PostgreSQL データ型にマッピングします。
| ClickHouse | PostgreSQL | 備考 |
|---|---|---|
| Bool | boolean | |
| Date | 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 インターフェイス経由で接続し、単一のクエリを実行してから切断します。省略可能な 2 番目の引数には接続文字列を指定でき、指定しない場合のデフォルトは host=localhost port=8123 です。サポートされている接続パラメータは次のとおりです。
host: 接続先のホスト。必須。port: 接続先の HTTP ポート。hostが ClickHouse Cloud のホストでない場合のデフォルトは8123、ClickHouse Cloud のホストである場合のデフォルトは8443dbname: 接続先のデータベース名。username: 接続時に使用するユーザー名。デフォルトはdefaultpassword: 認証に使用するパスワード。デフォルトはパスワードなし
レコードを返さないクエリに便利ですが、値を返すクエリの場合は、単一のテキスト値として返されます。
プッシュダウン関数
条件式(HAVING および WHERE 句)で使用される PostgreSQL のすべての組み込み関数は、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 によって作成されるこれらのカスタム関数は、PostgreSQL に同等の機能が存在しない一部の ClickHouse 関数に対して、外部クエリのプッシュダウンを可能にします。これらの関数のいずれかがプッシュダウンできない場合は、例外を発生させます。
キャストのプッシュダウン
pg_clickhouse は、互換性のあるデータ型に対して CAST(x AS bigint) のようなキャストをプッシュダウンします。互換性のない型の場合はプッシュダウンが失敗します。この例で x が ClickHouse の UInt64 である場合、ClickHouse はその値のキャストを拒否します。
互換性のないデータ型へのキャストをプッシュダウンするために、pg_clickhouse は次の関数を提供します。これらの関数がプッシュダウンされなかった場合、PostgreSQL で例外をスローします。
プッシュダウンされる集約関数
これらの PostgreSQL 集約関数は ClickHouse へプッシュダウンされます。
カスタム集約関数
pg_clickhouse によって定義されるこれらのカスタム集約関数は、PostgreSQL に同等の機能が存在しない一部の ClickHouse 集約関数に対して、外部クエリのプッシュダウンを可能にします。これらの関数のいずれかをプッシュダウンできない場合は、例外を発生させます。
プッシュダウンされる順序付き集合集約
これらの ordered-set aggregate functions は、direct argument をパラメータとして渡し、ORDER BY の式を引数として渡すことで、ClickHouse の Parametric
aggregate functions に対応します。例えば、次の PostgreSQL クエリでは:
これは次の ClickHouse クエリに対応しています:
デフォルト以外の ORDER BY 句の接尾辞である DESC および NULLS FIRST はサポートされておらず、指定するとエラーになります。
percentile_cont(double): quantilequantile(double): quantilequantileExact(double): quantileExact
セッション設定
pg_clickhouse.session_settings ランタイムパラメーターを設定して、
以降のクエリに適用される ClickHouse settings を構成します。例:
デフォルトは join_use_nulls 1 です。空文字列に設定すると、
ClickHouse サーバー側の設定が使用されます。
この構文は、カンマ区切りのキーと値のペアのリストで、1つ以上のスペースで区切られます。キーは ClickHouse settings に対応している必要があります。値中の空白、カンマ、およびバックスラッシュは、バックスラッシュでエスケープします:
スペースやカンマをエスケープせずに済むように値をシングルクォートで囲むか、二重引用符を重ねて書く必要がないように dollar quoting の利用を検討してください:
可読性を重視し、設定項目が多い場合は、たとえば次のように複数行に分けて記述してください。
pg_clickhouse は設定を検証せず、すべてのクエリについて設定をそのまま ClickHouse に渡します。そのため、各 ClickHouse バージョンのすべての設定をサポートします。
なお、pg_clickhouse.session_settings を設定する前に pg_clickhouse をロードしておく必要があります。library preloading を使用するか、拡張機能内のいずれかのオブジェクトを利用してロードされるようにしてください。
著者
著作権
-
Copyright (c) 2025, ClickHouse
-
Portions Copyright (c) 2023-2025, Ildus Kurbangaliev
-
Portions Copyright (c) 2019-2023, Adjust GmbH
-
Portions Copyright (c) 2012-2019, PostgreSQL Global Development Group