pg_clickhouse リファレンス ドキュメント
説明
pg_clickhouse は、foreign data wrapper を含む ClickHouse データベース上でのリモートでのクエリ実行を可能にする PostgreSQL 拡張機能です。PostgreSQL 13 以降および ClickHouse 23 以降に対応しています。
はじめに
pg_clickhouse を試してみる最も簡単な方法は Docker image を利用することです。これは、 pg_clickhouse 拡張機能を組み込んだ標準の PostgreSQL Docker イメージを含んでいます。
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 を実行する必要があります。
DDL SQL リファレンス
次に示す 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 に依存するオブジェクトが 1 つでも存在すると失敗します。CASCADE 句を使用して、それらも同時に削除してください。
CREATE SERVER
CREATE SERVER を使用して、ClickHouse サーバーに接続するための外部サーバーを作成します。例:
サポートされているオプションは次のとおりです:
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 でサポートされているオプションを用いて定義されます。
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 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 句を指定します。
DML SQL リファレンス
以下の SQL DML 文では pg_clickhouse を使用する場合があります。以下の例は、 make-logs.sql によって CREATE で作成されたこれらの ClickHouse テーブルに依存します。
EXPLAIN
EXPLAIN コマンドは期待どおりに動作しますが、VERBOSE オプションを指定すると、
ClickHouse に対して「Remote SQL」クエリが発行されます。
このクエリでは、「Foreign Scan」プランノードを介してリモート SQL が ClickHouse にプッシュダウンされます。
SELECT
SELECT ステートメントを使用して、pg_clickhouse テーブルに対しても他のテーブルと同様にクエリを実行できます。
pg_clickhouse は、集約関数を含め、可能な限り多くのクエリ実行を ClickHouse 側にプッシュダウンするように動作します。EXPLAIN を使用して、どの程度プッシュダウンされているかを確認してください。たとえば上記のクエリでは、実行はすべて ClickHouse 側にプッシュダウンされます。
pg_clickhouse は、同じリモートサーバー上にあるテーブルに対する JOIN もプッシュダウンできます。
ローカルテーブルとの結合は、慎重にチューニングしないと非効率なクエリを生成します。この例では、nodes テーブルのローカルコピーを作成し、リモートテーブルではなくそのローカルテーブルと結合します。
この場合は、ローカルのカラムではなく node_id でグループ化することで、集約処理のより多くの部分を ClickHouse 側に押し込み、その後でルックアップテーブルと結合できます。
"Foreign Scan" ノードは node_id ごとに集約をプッシュダウンするようになり、
Postgres 側に取り込む必要がある行数は 1000 行(すべて)からわずか 8 行(各ノードにつき 1 行)に減少します。
PREPARE、EXECUTE、DEALLOCATE
v0.1.2 以降、pg_clickhouse はパラメータ化されたクエリをサポートしており、主に PREPARE コマンドによって作成されます。
準備済みステートメントを実行するには、通常どおり EXECUTE を使用してください。
pg_clickhouse は、集約処理を通常どおりプッシュダウンし、その様子は EXPLAIN の verbose 出力から確認できます。
ここでは、パラメータプレースホルダではなく、完全な日付値そのものが送信されている点に注意してください。
これは、PostgreSQL の [PREPARE notes] で説明されているとおり、最初の 5 回のリクエストについて当てはまります。6 回目の実行時には、ClickHouse には
{param:type} 形式の [クエリパラメータ] を送信します:
パラメータ:
準備済みステートメントを解放するには DEALLOCATE を使用します。
INSERT
INSERT コマンドを使用して、リモートの ClickHouse テーブルに値を挿入します。
COPY
COPY コマンドを使用して、リモートの ClickHouse テーブルに複数行を一括挿入します。
⚠️ バッチ API の制限事項
pg_clickhouse では、PostgreSQL FDW のバッチ挿入 API はまだサポートされていません。 そのため、現在 COPY はレコードを挿入するために INSERT 文を使用しています。 この制限は今後のリリースで改善される予定です。
LOAD
LOAD を使用して pg_clickhouse の共有ライブラリを読み込みます。
通常、LOAD を使用する必要はありません。Postgres は、pg_clickhouse のいずれかの機能(関数、外部テーブルなど)が初めて使用されたときに、自動的に pg_clickhouse をロードします。
LOAD を使って pg_clickhouse をロードすることが有用になる唯一のケースは、それに依存するクエリを実行する前に、SET を用いて pg_clickhouse のパラメータを設定したい場合です。
SET
SET を使用して、pg_clickhouse.session_settings ランタイムパラメータを指定します。
このパラメータによって、後続のクエリに適用される [ClickHouse 設定] が構成されます。例:
デフォルトは join_use_nulls 1 です。空文字列に設定すると、ClickHouse サーバー側の設定にフォールバックします。
構文は、キーと値のペアをカンマ区切りで並べたリストで、ペア同士は 1 つ以上のスペースで区切ります。キーは ClickHouse settings に対応する必要があります。値中のスペース、カンマ、バックスラッシュは、バックスラッシュでエスケープします。
または、スペースやカンマをエスケープする必要がないように、値をシングルクォートで囲みます。ダブルクォートで囲む必要がないようにするには、dollar quoting の使用を検討してください。
可読性を重視し、多くの設定を行う必要がある場合は、例えば次のように複数行に分けて記述します。
pg_clickhouse は設定を検証せず、クエリごとにそれらをそのまま ClickHouse に渡します。 したがって、ClickHouse の各バージョンで利用可能なすべての設定をサポートします。
pg_clickhouse は pg_clickhouse.session_settings を設定する前にロードされている必要があることに注意してください。[shared library preloading] を利用するか、
拡張機能内のいずれかのオブジェクトを単純に使用して、ロードされるようにしてください。
ALTER ROLE
ALTER ROLE の SET コマンドを使用して、特定のロールに対して pg_clickhouse をプリロードしたり、パラメータを SET で設定したりします。
ALTER ROLE の RESET コマンドを使用して、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
HTTP インターフェイス経由で ClickHouse サービスに接続し、単一の
クエリを実行してから切断します。省略可能な第 2 引数には接続文字列を指定でき、
指定しない場合は host=localhost port=8123 がデフォルトになります。サポートされている接続パラメータは次のとおりです。
host: 接続先ホスト。必須。port: 接続先の HTTP ポート。hostが ClickHouse Cloud のホストでない場合のデフォルトは8123、ClickHouse Cloud のホストである場合のデフォルトは8443dbname: 接続するデータベース名。username: 接続に使用するユーザー名。デフォルトはdefaultpassword: 認証に使用するパスワード。デフォルトはパスワードなし
レコードを返さないクエリに有用ですが、値を返すクエリの場合は、 結果は 1 つのテキスト値として返されます。
プッシュダウン関数
ClickHouse 外部テーブルをクエリするために条件(HAVING 句および WHERE
句)で使用されるすべての PostgreSQL 組み込み関数は、同じ名前とシグネチャのまま
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 集約関数に対して、外部クエリプッシュダウンを提供します。これらの関数のいずれかをプッシュダウンできない場合には、例外をスローします。
プッシュダウン順序付き Set 集約
これらの 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
著者
Copyright
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 でのプリペアドステートメントの代替手段"