SELECT および INSERT クエリを実行できます。
現在、テーブルエンジンでサポートされているのは PostgreSQL バージョン 12 以降のみです。
テーブルの作成
- カラム名は元の PostgreSQL テーブルと同じである必要がありますが、それらのうち一部のカラムのみを、任意の順序で使用できます。
- カラム型は元の PostgreSQL テーブルのものと異なっていてもかまいません。ClickHouse は値を ClickHouse のデータ型にキャストしようとします。
- external_table_functions_use_nulls 設定は、Nullable カラムの扱いを定義します。デフォルト値は 1 です。0 の場合、テーブル関数は Nullable カラムを作成せず、null の代わりにデフォルト値を挿入します。これは配列内の NULL 値にも適用されます。
host:port— PostgreSQL サーバーのアドレス。database— リモートデータベース名。table— リモートテーブル名、または PostgreSQL にそのまま渡されるクエリです (テーブル名の代わりにクエリを渡す を参照) 。user— PostgreSQL ユーザー。password— ユーザーのパスワード。schema— デフォルト以外のテーブルスキーマ。省略可能です。on_conflict— 競合解決戦略。例:ON CONFLICT DO NOTHING。省略可能です。注意: このオプションを追加すると、挿入効率が低下します。
設定
PostgreSQL テーブルエンジン (および postgresql テーブル関数) で使用される接続プールは、SETTINGS 句を使ってテーブルごとに設定できます。設定を指定しない場合は、対応するクエリレベルの postgresql_* 設定の値がデフォルトで使用されます。
postgresql_connection_pool_size
16。
postgresql_connection_pool_wait_timeout
0 は、プールが空のときにブロックすることを意味します。
デフォルト値: 5000。
postgresql_connection_pool_retries
2。
postgresql_connection_pool_auto_close_connection
false。
postgresql_connection_attempt_timeout
connect_timeout パラメータとして渡されます。
デフォルト値: 2。
例:
実装の詳細
SELECTクエリは、読み取り専用の PostgreSQL トランザクション内で COPY (SELECT ...) TO STDOUT として実行され、各SELECTクエリの後にコミットされます。
=, !=, >, >=, <, <=, IN などの単純なWHERE句は、PostgreSQL サーバー上で実行されます。
すべての JOIN、集計、ソート、IN [ array ] 条件、およびLIMITによるサンプリング制約は、PostgreSQL へのクエリが完了した後にのみ ClickHouse で実行されます。
テーブル名の代わりにクエリを渡す
table引数には、そのまま PostgreSQL に渡される SELECTクエリを指定できます。テーブルの構造はクエリ結果から推論されます。クエリは、サブクエリとして記述することも、query関数でラップすることもできます。
INSERTは許可されていません。同じ構文は postgresql テーブル関数でもサポートされています。
サブクエリ形式
(SELECT ...) は ClickHouse によって解析され、サーバーに送信される前に PostgreSQL 方言 (PostgreSQL の識別子の引用符付けと文字列リテラルのエスケープ) で再シリアライズされます。したがって、有効な ClickHouse SQL である必要があります。ClickHouse が解析しない PostgreSQL 固有の構文を渡すには、query('...') 形式を使用してください。この形式のテキストは、そのまま PostgreSQL に送信されます。渡されたクエリに対して、外側の ClickHouse クエリのWHERE、LIMIT、集計などがプッシュダウンされることはなく、完全なクエリ結果が取得された後に ClickHouse で適用されます。PostgreSQL から読み取るデータを制限するには、渡されたクエリの内部にフィルターを置いてください。external_table_strict_query = 1 を使用すると、プッシュダウンできない外側のフィルターは、ローカルで適用される代わりに例外で拒否されます。INSERTクエリは、PostgreSQL トランザクション内で COPY "table_name" (field1, field2, ... fieldN) FROM STDIN として実行され、各INSERTステートメントの後に自動コミットされます。
PostgreSQL のArray型は ClickHouse の Array に変換されます。
注意してください。PostgreSQL では、
type_name[] のように作成された配列データには、同じカラム内でも行ごとに次元数が異なる多次元配列を含めることができます。一方 ClickHouse では、同じカラム内のすべての行で次元数が同じ多次元配列しか許可されません。|で列挙する必要があります。例えば:
0 です。
以下の例では、レプリカ example01-1 の優先度が最も高くなっています。