説明
はじめに
使い方
バージョニングポリシー
- API の変更時にはメジャーバージョンが増加します
- 後方互換性のある SQL の変更時にはマイナーバージョンが増加します
- binary のみの変更時にはパッチバージョンが増加します
- ライブラリバージョン (PostgreSQL 18 以降では
PG_MODULE_MAGICによって定義) には完全なセマンティックバージョンが含まれており、pgch_version()関数の出力または Postgres のpg_get_loaded_modules()関数で確認できます。 - 拡張機能バージョン (control file で定義) にはメジャー
バージョンとマイナーバージョンのみが含まれており、
pg_catalog.pg_extensionテーブル、pg_available_extension_versions()関数の出力、および\dx pg_clickhouseで確認できます。
v0.1.0 から v0.1.1 へのようにパッチバージョンが増加する release では、v0.1 を読み込んでいるすべての
database がその恩恵を受けられ、アップグレードを反映するために
ALTER EXTENSION を実行する必要がないことを意味します。
一方、マイナーバージョンまたはメジャーバージョンが増加する release には
SQL アップグレードスクリプトが付属し、拡張機能を含む既存のすべての database では、
アップグレードを反映するために ALTER EXTENSION pg_clickhouse UPDATE を実行する必要があります。
DDL SQL リファレンス
CREATE EXTENSION
WITH SCHEMA を使用します (推奨) :
ALTER EXTENSION
-
pg_clickhouse の新しい release をインストールした後は、
UPDATE句を使用します。 -
拡張機能を新しいスキーマに移動するには、
SET SCHEMAを使用します。
DROP EXTENSION
CASCADE 句を使用してください:
CREATE SERVER
driver: 使用する ClickHouse 接続ドライバーです。“binary” または “http” のいずれかを指定します。必須です。dbname: 接続時に使用する ClickHouse データベースです。デフォルトは “default” です。fetch_size: HTTPストリーミングの、おおよそのバッチサイズ (バイト単位) です。バッチは 行の境界で分割されます。デフォルトは50000000(50 MB) です。0を指定すると ストリーミングが無効になり、レスポンス全体がバッファリングされます。外部テーブルはこの 値を上書きできます。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
DROP SERVER
CASCADE を使用すると、
それらの依存オブジェクトも削除できます:
CREATE USER MAPPING
taxi_srv 外部サーバー を使って接続する際に、現在の PostgreSQL ユーザーをリモートの ClickHouse ユーザーにマッピングするには、次のようにします。
user: ClickHouseユーザー名です。デフォルトは “default” です。password: ClickHouseユーザーのパスワードです。
ALTER USER MAPPING
DROP USER MAPPING
IMPORT FOREIGN SCHEMA
LIMIT TO を使用して、インポート対象を特定のテーブルのみに限定します:
EXCEPT を使用してテーブルを除外します:
CREATE FOREIGN TABLE
database: リモートデータベースの名前です。デフォルトでは、外部サーバーに 定義されているデータベースが使用されます。fetch_size: HTTP streaming のおおよそのバッチサイズ (バイト単位) です。サーバーレベルのfetch_sizeを上書きします。デフォルトは50000000(50 MB) です。0を指定すると streaming が無効になり、レスポンス全体がバッファされます。table_name: リモートテーブルの名前です。デフォルトでは、外部テーブルに 指定された名前が使用されます。engine: ClickHouse テーブルで使用される [テーブルエンジン] です。CollapsingMergeTree()およびAggregatingMergeTree()では、pg_clickhouse が テーブル上で実行される関数式に対して自動的にパラメーターを適用します。
-
column_name: ClickHouse 側のカラム名です。クエリや INSERT のデパース時には、PostgreSQL の属性名よりもこちらが優先して使用されます。 これは、引用符なしの小文字の PostgreSQL カラム名を 大文字と小文字を区別する ClickHouse カラムにマッピングする場合に便利です。例: -
AggregateFunction: [AggregateFunction 型] カラムに適用される 集約関数の名前です。データ型を、その関数に渡される ClickHouse の型にマッピングし、適切なカラムオプションで 集約関数名を指定すると、pg_clickhouse が自動的に カラムを評価する集約関数にMergeを付加します。 -
SimpleAggregateFunction: [SimpleAggregateFunction 型] カラムに適用される 集約関数の名前です。データ型を、その関数に渡される ClickHouse の型にマッピングし、適切なカラムオプションで 集約関数名を指定してください。
ALTER FOREIGN TABLE
DROP FOREIGN TABLE
CASCADE 句を使用します:
DML SQL リファレンス
EXPLAIN
VERBOSE オプションを指定すると
ClickHouse の “Remote SQL” クエリが出力されます:
SELECT
nodes テーブルのローカルコピーを作成し、リモートテーブルの代わりに
それと JOIN します。
node_id でグループ化することで、
集約処理のより多くを ClickHouse 側に任せられ、その後で
ルックアップテーブルと join できます。
node_id ごとの集約がプッシュダウンされるようになり、
Postgres に引き戻す必要のある行数が 1000 行 (全件) から
各ノード 1 行ずつのわずか 8 行まで削減されます。
PREPARE, EXECUTE, DEALLOCATE
{param:type} 形式の[クエリパラメータ]が送信されます。
パラメータ:
INSERT
COPY
⚠️ Batch API の制限 pg_clickhouse は、PostgreSQL FDW のバッチ insert API のサポートをまだ実装していません。そのため、現在 COPY はレコードを 挿入するために INSERT ステートメントを使用しています。これは今後のリリースで改善される予定です。
LOAD
SET
pg_clickhouse.session_settings
pg_clickhouse.session_settings パラメーターは、後続のクエリに適用する [ClickHouse
設定] を指定します。例:
join_use_nulls 1, group_by_use_nulls 1, final 1 です。ClickHouse server の設定に戻すには、これを
空文字列に設定します。
date_time_output_format: http ドライバーではこれが “iso” である必要がありますformat_tsv_null_representation: http ドライバーではデフォルト値が必要ですoutput_format_tsv_crlf_end_of_linehttp ドライバーではデフォルト値が必要です
pg_clickhouse.session_settings を設定する前に、
pg_clickhouse を読み込んでおく必要がある点に注意してください。[共有ライブラリのプリロード] を使用するか、
または拡張機能内のいずれかのオブジェクトを使って、確実に読み込まれるようにしてください。
pg_clickhouse.pushdown_regex
pg_clickhouse.pushdown_regex パラメータは、pg_clickhouse が
正規表現関数および演算子をプッシュダウンするかどうかを制御します。既定では
プッシュダウンが有効です。プッシュダウンを無効にするには、このパラメータを false に設定します:
ALTER ROLE
SET コマンドを使用すると、pg_clickhouse をプリロードしたり、
特定のロールに対してそのパラメータをSETしたりできます。
RESET コマンドを使用して、pg_clickhouse のプリロード設定
やパラメータをリセットします:
プリロード
session_preload_libraries
データ型
| ClickHouse | PostgreSQL | 注記 |
|---|---|---|
| Bool | boolean | |
| Date | date | |
| Date32 | date | |
| DateTime | timestamptz | |
| Decimal | numeric | |
| Float32 | real | |
| Float64 | double precision | |
| IPv4 | inet | |
| IPv6 | inet | |
| Int16 | smallint | |
| Int32 | integer | |
| Int64 | bigint | |
| Int8 | smallint | |
| JSON | jsonb, json | |
| String | text, bytea | |
| UInt16 | integer | |
| UInt32 | bigint | |
| UInt64 | bigint | 値が BIGINT の最大値を超えるとエラー |
| UInt8 | smallint | |
| UUID | uuid |
BYTEA
SELECTクエリの出力は以下のとおりです:
関数と演算子のリファレンス
関数
clickhouse_raw_query
host=localhost port=8123 です。サポートされる connection
parameter は次のとおりです。
host: 接続先の host。必須です。port: 接続先の HTTP port。デフォルトは8123ですが、hostが ClickHouse Cloud host の場合は8443になりますdbname: 接続先の database 名。username: 接続に使用する username。デフォルトはdefaultですpassword: 認証に使用する password。デフォルトでは password はありません
EXECUTE 権限はありません。GRANTで、
アドホックな ClickHouse クエリを正当に実行する必要があるロールにのみ
アクセスを付与することを検討してください。たとえば、専用の ClickHouse 管理者ロールです。
結果を返さないクエリに便利ですが、値を返すクエリの場合は
単一のテキスト値として返されます。
プッシュダウン関数
pg_clickhouse は、条件式 (HAVING 句および WHERE 句) で使用される PostgreSQL の組み込み関数の一部をプッシュダウンします。対応する関数は、ClickHouse では以下のとおりです。
abs: absfactorial: factorialmod(int2/int4/int8/numeric): 剰余pow&power(float8/numeric): powround: roundsin,cos,tan,atan,atan2,sinh,cosh,tanh,asinh,degrees,radians,pi: ClickHouse の数学関数 と同名です。asin,acos,atanh,acoshはプッシュダウンされません。PG では範囲外の入力でエラーになりますが、CH ではNaNが返されます。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
extract(field FROM source):date_partと同じ対応date(timestamp)&date(timestamptz): toDate (CH aliasdateとしてデパースされます)array_position: indexOfarray_cat: arrayConcatarray_append: arrayPushBackarray_prepend: arrayPushFrontarray_remove: arrayRemovearray_length&cardinality: lengtharray_to_string: arrayStringConcatstring_to_array: splitByStringsplit_part: splitByString + 配列の添字指定trim_array: arrayResizearray_fill: arrayWithConstantarray_reverse: arrayReversearray_shuffle: arrayShufflearray_sample: arrayRandomSamplearray_sort: arraySort / arrayReverseSortbtrim: trimBothltrim: ltrimrtrim: rtrimconcat_ws: concatWithSeparatorlower(text): lowerUTF8upper(text): upperUTF8substring(text, ...)&substr(text, ...): substringUTF8substring(bytea, ...)&substr(bytea, ...): substringlength(text): lengthUTF8length(bytea)&octet_length: lengthreverse(text): reverseUTF8reverse(bytea): reversestrpos: positionUTF8regexp_like: matchregexp_replace:gフラグがある場合は replaceRegexpOne、または replaceRegexpOneregexp_split_to_array: splitByRegexpmd5: MD5json_extract_path_text: サブカラムの構文json_extract_path: toJSONString + サブカラムの構文jsonb_extract_path_text: サブカラム構文jsonb_extract_path: toJSONString + サブカラムの構文bit_count(bytea): bitCountto_timestamp(float8): fromUnixTimestampto_char(timestamp[tz], fmt):fmtが、含まれるすべてのキーワードに ClickHouse で忠実に対応するものがある文字列定数である場合は、formatDateTime です。対応しているキーワードについては、Compatibility Notes の to_char() を参照してください。それ以外の場合、この関数は PostgreSQL 側でローカルに評価されます。statement_timestamp,transaction_timestamp, &clock_timestamp: nowInBlock64 (nowInBlock64(9, $session_timezone))CURRENT_DATE: now および toDate (toDate(now($session_timezone)))now,CURRENT_TIMESTAMP, &LOCALTIMESTAMP: now64 (now64(9, $session_timezone))CURRENT_TIMESTAMP(n)&LOCALTIMESTAMP(n): now64 (now64(n, $session_timezone))CURRENT_DATABASE: PostgreSQL 関数から渡される値です。CURRENT_SCHEMA: PostgreSQL関数から渡される値。CURRENT_CATALOG: PostgreSQL 関数から渡される値です。CURRENT_USER: PostgreSQL 関数の値として渡されます。USER: PostgreSQL の関数から値として渡されます。CURRENT_ROLE: PostgreSQL の関数から値として渡されます。SESSION_USER: PostgreSQL 関数から値として渡されるものです。
プッシュダウン演算子
- Array スライス (
arr[L:U]): arraySlice @>(配列が含む) : hasAll<@(配列に含まれる) : hasAll&&(配列の重複) : hasAny~(正規表現に一致) : match!~(正規表現に一致しない) : match~*(大文字と小文字を区別しない正規表現に一致しない) : match!~*(大文字と小文字を区別しない正規表現に一致しない) : match->>(JSON/JSONB の要素をテキストとして抽出) : sub-column syntax->(JSON/JSONB を抽出) : toJSONString + sub-column syntax
カスタム関数
pg_clickhouse が作成するこれらのカスタム関数は、PostgreSQL に対応する機能がない一部の ClickHouse 関数について、外部クエリのプッシュダウンを可能にします。これらの関数のいずれかをプッシュダウンできない場合は、例外が発生します。
拡張機能のプッシュダウン
re2
re2match→ matchre2extract→ extractre2extractall→ extractAllre2regexpextract→ regexpExtractre2extractgroups→ extractGroupsre2replaceregexpone→ replaceRegexpOnere2replaceregexpall→ replaceRegexpAllre2countmatches→ countMatchesre2countmatchescaseinsensitive→ countMatchesCaseInsensitivere2multimatchany→ multiMatchAnyre2multimatchanyindex→ multiMatchAnyIndexre2multimatchallindices→ multiMatchAllIndices
intarray
idx→ indexOf
fuzzystrmatch
soundex: soundexlevenshtein(2引数) : editDistanceUTF8
キャストのプッシュダウン
CAST(x AS bigint) のようなキャストをプッシュダウンします。互換性のない型ではプッシュダウンに失敗します。たとえば、この例で x が ClickHouse の UInt64 である場合、ClickHouse はその値をキャストしません。
互換性のないデータ型へのキャストをプッシュダウンするために、pg_clickhouse は次の関数を提供しています。これらの関数は、プッシュダウンされなかった場合に PostgreSQL で例外を発生させます。
集計のプッシュダウン
カスタム集約関数
pg_clickhouse が作成するこれらのカスタム集約関数は、PostgreSQL に同等の機能がない一部の ClickHouse 集約関数について、外部クエリのプッシュダウンを提供します。これらの関数のいずれかをプッシュダウンできない場合は、例外をスローします。
ordered-set 集約関数 の プッシュダウン
ORDER BY 式を引数として渡すことで、ClickHouse のParametric
集約関数に対応します。たとえば、次の PostgreSQL クエリです。
ORDER BY 接尾辞である DESC と NULLS FIRST は
サポートされておらず、error が発生します。
percentile_cont(double): quantilequantile(double): quantilequantileExact(double): quantileExact
プッシュダウン可能なウィンドウ関数
OVER (PARTITION BY ... ORDER BY ...) 句とともに ClickHouse にプッシュダウンされます。
- row_number
- rank
- dense_rank
- ntile
- cume_dist
- percent_rank
- lead
- lag
- first_value
- last_value
- nth_value
min/max(OVER句付き)
row_number、rank、dense_rank、ntile、cume_dist、
percent_rank) は、ClickHouse ではこれらの関数に対するフレーム指定が受け付けられないため、プッシュダウン時にはフレーム句が省略されます。
互換性に関する注意
正規表現
-
PostgreSQL は POSIX Regular Expressions をサポートし、ClickHouse は
RE2 正規表現 をサポートします。動作の違いに注意してください。正規表現が
ClickHouse で評価される場合 (例:
WHERE句内) は RE2 を、 Postgres で評価される場合 (例:SELECT句内) は POSIX を 記述してください。 -
pg_clickhouse は Postgres の [Regex flags] を
ClickHouse の正規表現の先頭に
(?)内で付与することで pushdown します。たとえば:は次のようになります-sが含まれている点に注意してください。これは、ClickHouse でデフォルトで有効なsを 無効化し、Postgres の正規表現の動作に合わせるためです。 Postgres 関数呼び出し内のフラグにsが含まれている場合、pg_clickhouse は-sを付けません。 残念ながら、この挙動により Postgres 24 以前では 一部の正規表現との互換性が損なわれます。 -
両方がサポートしており、そのため ClickHouse で評価される場合に
使用できるフラグは次のとおりです:
i: 大文字小文字を区別しないm: 複数行モードs:.を\nに一致させるp: 改行に部分的に敏感なマッチング (sと同様に扱われる)t: 厳格な構文 (デフォルト。pg_clickhouse によって削除される)
- 正規表現関数にこれ以外のフラグが渡されると、 その関数は pushdown されません。
-
例外は
regexp_replace()で、これはgフラグもサポートします。gが 指定されている場合、pg_clickhouse はreplaceRegexpOne()の代わりにreplaceRegexpAll()を使用し、他のフラグを先頭に付与する前にgフラグを削除します。 -
Postgres の
regexp_replace()の置換引数では、マッチ全体を参照するために\&を サポートしますが、ClickHouse ではマッチ全体の参照に\0を使用します。 関数が ClickHouse に pushdown される場合は、必ず\0を使用してください。
to_char()
timestamp および timestamp with time zone に対する PostgreSQL の to_char() は、フォーマット引数が非 NULL の文字列定数であり、なおかつ含まれる PostgreSQL のキーワードがすべて ClickHouse にバイト単位で完全一致する対応を持つ場合にのみ、ClickHouse の formatDateTime にプッシュダウンされます。フォーマットが動的な場合 (Const ではない場合) 、または未サポートのキーワードや modifier を含む場合、この呼び出しは PostgreSQL でローカルに評価されます。部分的な変換でプッシュダウンを試みることはないため、出力は PG 互換のまま保たれます。
numeric、interval、およびその他の timestamp 以外の型に対する 2 引数の to_char() 形式は、プッシュダウンされません。ClickHouse の formatDateTime は日付時刻値のみをフォーマットします。
変換されるキーワード
| PostgreSQL | ClickHouse | 意味 |
|---|---|---|
YYYY, yyyy | %Y | 4桁の年 |
YY, yy | %y | 2桁の年 |
MM, mm | %m | ゼロ埋めされた月 (01–12) |
DD, dd | %d | ゼロ埋めされた日 (01–31) |
DDD, ddd | %j | ゼロ埋めされた年内通算日 (001–366) |
HH24, hh24 | %H | ゼロ埋めされた24時間表記の時 (00–23) |
HH, hh, HH12, hh12 | %I | ゼロ埋めされた12時間表記の時 (01–12) |
MI, mi | %i | ゼロ埋めされた分 (00–59) |
SS, ss | %S | ゼロ埋めされた秒 (00–59) |
Q, q | %Q | 四半期 (1–4) |
Mon | %b | 省略した月名 (例: Oct) |
Dy | %a | 省略した曜日名 (例: Mon) |
AM, PM | %p | 午前・午後の指定子 (常に大文字) |
引用符付きテキストとリテラル
"..." で囲まれたテキストは、そのまま渡されます。リテラルの % は、
ClickHouse の指定子プレフィックスをエスケープするため、%% に
二重化されます。引用符の外側にある \" も、リテラルの " としてそのまま
渡されます。"..." の内側では、バックスラッシュでエスケープされるのは " のみで、
それ以外のバックスラッシュシーケンスはリテラルテキストとして扱われます。
David E. Wheeler