説明
はじめに
使用方法
バージョニングポリシー
- API に変更がある場合、メジャーバージョンが増分されます
- 後方互換性のある SQL の変更がある場合、マイナーバージョンが増分されます
- バイナリのみに関する変更がある場合、パッチバージョンが増分されます
- ライブラリバージョン (PostgreSQL 18 以降では
PG_MODULE_MAGICによって定義) は、完全なセマンティックバージョンを含み、pgch_version()関数の出力または Postgres の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 リファレンス
CREATE EXTENSION
WITH SCHEMA を使用します (推奨) :
ALTER EXTENSION
-
pg_clickhouse の新しいリリースをインストールした後は、
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: リモート database の名前です。デフォルトでは、foreign server に定義された database が使用されます。fetch_size: HTTP streaming のおおよその Batch サイズ (バイト単位) です。サーバーレベルのfetch_sizeを上書きします。デフォルトは50000000(50 MB) です。0を指定すると streaming は無効になり、応答全体がバッファされます。table_name: リモート table の名前です。デフォルトでは、外部テーブル に指定された名前が使用されます。engine: ClickHouse テーブルで使用する table engine です。CollapsingMergeTree()およびAggregatingMergeTree()では、pg_clickhouse が テーブルに対して実行される関数式にパラメーターを自動的に適用します。
-
column_name: ClickHouse 側のカラム名です。クエリや insert のデパース時に、PostgreSQL の attribute 名より優先して使用されます。 引用符なしの小文字の PostgreSQL カラム名を、大文字と小文字を区別する ClickHouse カラムに 対応付ける場合に便利です。例: -
AggregateFunction: AggregateFunction Type カラムに適用される aggregate function の名前です。データ型は、その関数に渡される ClickHouse の型に 対応付けてください。適切なカラムオプションで aggregate function の名前を指定すると、 pg_clickhouse はそのカラムを評価する aggregate function にMergeを 自動的に付加します。 -
SimpleAggregateFunction: SimpleAggregateFunction Type カラムに適用される aggregate function の名前です。データ型は、その関数に渡される ClickHouse の型に対応付け、適切なカラムオプションで aggregate function の名前を指定してください。
ALTER FOREIGN TABLE
DROP FOREIGN TABLE
CASCADE 句を使用します:
DML SQL リファレンス
EXPLAIN
VERBOSE オプションを指定すると
ClickHouse の “Remote SQL” クエリが出力されます:
SELECT
nodes テーブルのローカルコピーを
作成し、それと結合します。
node_id でグループ化することで、
集約処理のより多くを ClickHouse 側に押し下げ、
その後でルックアップテーブルと結合できます:
node_id による集約をプッシュダウンするようになり、
Postgres に引き戻す必要のある行数を 1000 (そのすべて) から
各ノードにつき 1 行、わずか 8 行まで削減します。
PREPARE, EXECUTE, DEALLOCATE
{param:type} 形式の[クエリパラメータ]が送信されます。
parameters:
INSERT
COPY
⚠️ Batch API の制限事項 pg_clickhouse は、PostgreSQL FDW の Batch 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サーバーの設定にフォールバックします。
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 です。使用可能な接続
パラメーターは次のとおりです。
host: 接続先のホスト。必須です。port: 接続先の HTTP ポート。デフォルトは8123ですが、hostが ClickHouse Cloud ホストの場合は8443になりますdbname: 接続先の database 名。username: 接続時に使用するユーザー名。デフォルトはdefaultですpassword: 認証に使用するパスワード。デフォルトではパスワードは設定されていません
EXECUTE 権限はどのロールにもありません。アドホックな ClickHouse
クエリを実行する正当な必要があるロールにのみ、アクセスを GRANT することを検討してください。
たとえば、専用の ClickHouse admin ロールなどです。
レコードを返さないクエリに便利ですが、値を返すクエリの場合は
単一のテキスト値として返されます。
プッシュダウン関数
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 エイリアスdateとしてデパースされます)array_position: indexOfarray_cat: arrayConcatarray_append: arrayPushBackarray_prepend: arrayPushFrontarray_remove: arrayRemovearray_length&カーディナリティ: 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): formatDateTimefmtが文字列定数で、そのすべてのキーワードに ClickHouse で忠実に対応するものがある場合。サポートされるキーワードについては、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 の要素をテキストとして抽出) : サブカラム構文->(JSON/JSONB を抽出) : toJSONString + サブカラム構文
カスタム関数
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 集約関数に対する外部クエリのプッシュダウンを可能にします。これらの関数のいずれかをプッシュダウンできない場合は、例外がスローされます。
Pushdown 順序付き集合集約関数
ORDER BY 式を引数として渡すことで、ClickHouse の[パラメトリック
集約関数]に対応します。たとえば、次の PostgreSQL クエリです。
ORDER BY 接尾辞である DESC および NULLS FIRST は
サポートされておらず、使用するとエラーになります。
percentile_cont(double): quantilequantile(double): quantilequantileExact(double): quantileExact
Pushdown ウィンドウ関数
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 Regular Expressions をサポートします。動作の違いに注意してください。
正規表現が ClickHouse によって評価される場合 (たとえば
WHERE句内) は RE2 で記述し、Postgres によって評価される場合 (たとえばSELECT句内) は POSIX で記述してください。 -
pg_clickhouse は、Postgres の [Regex flags] を
(?)内に付加して、 ClickHouse の正規表現にプッシュダウンします。たとえば、次のような式は次のようになります。-sが含まれている点に注意してください。これは、ClickHouse でデフォルトで 有効になっているsを無効にし、Postgres の正規表現の動作に合わせるためです。 Postgres の関数呼び出しのフラグにsが含まれている場合、pg_clickhouse は-sを付加しません。残念ながら、この動作により Postgres 24 以前では 一部の正規表現との互換性が損なわれます。 -
両方でサポートされており、したがって ClickHouse で評価される場合に使用
できるフラグは、次のものだけです。
i: 大文字小文字を区別しないm: 複数行モード:s:.が\nに一致するp: 改行に部分的に依存するマッチング (sと同様に扱われる)t: 厳密な構文 (デフォルト。pg_clickhouse によって削除される)
- 正規表現関数にこれ以外のフラグが渡されると、その関数はプッシュダウンされません。
-
例外は
regexp_replace()で、これのみgフラグもサポートします。gが 指定されている場合、pg_clickhouse はreplaceRegexpOne()の代わりにreplaceRegexpAll()を使用し、他のフラグを付加する前にgを削除します。 -
Postgres の
regexp_replace()の置換引数では、マッチ全体を参照するために\&を使用できます。一方、ClickHouse ではマッチ全体を表すのに\0を 使用します。関数が ClickHouse にプッシュダウンされる場合は、必ず\0を 使用してください。
to_char()
timestamp および timestamp with time zone に対する PostgreSQL の to_char() は、フォーマット引数が NULL ではない文字列定数であり、かつその中の PostgreSQL の各キーワードにバイト単位で完全一致する ClickHouse の対応語がある場合にのみ、ClickHouse の formatDateTime にプッシュダウンされます。フォーマットが動的な場合 (Const ではない場合) や、未対応のキーワードまたは modifier を含む場合、この呼び出しは PostgreSQL 側でローカル評価にフォールバックします。部分的な変換で プッシュダウン を試みることはないため、出力は PostgreSQL 互換のまま保たれます。
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