PostgreSQL テーブルエンジン
The PostgreSQL engine allows SELECT
and INSERT
queries on data stored on a remote PostgreSQL server.
現在、PostgreSQLバージョン12以上のみがサポートされています。
Postgresテーブルエンジンに加えて、PeerDB by ClickHouseを使用して、PostgresからClickHouseへの継続的なデータパイプラインを設定できます。PeerDBは、PostgresからClickHouseへのデータを変更データキャプチャ(CDC)を使用して複製するために特別に設計されたツールです。
Creating a Table
CREATE TABLE クエリの詳細な説明を参照してください。
テーブル構造は元のPostgreSQLテーブル構造と異なる場合があります:
- カラム名は元のPostgreSQLテーブルと同じである必要がありますが、これらのカラムの一部のみを使用し、任意の順序で使用することができます。
- カラムタイプは元のPostgreSQLテーブルのものと異なる場合があります。ClickHouseは値をClickHouseデータ型にキャストしようとします。
- external_table_functions_use_nulls 設定は、Nullableカラムの扱い方を定義します。デフォルト値:1。0の場合、テーブル関数はNullableカラムを作成せず、nullの代わりにデフォルト値を挿入します。これは、配列内のNULL値にも適用されます。
Engine Parameters
host:port
— PostgreSQLサーバーアドレス。database
— リモートデータベース名。table
— リモートテーブル名。user
— PostgreSQLユーザー。password
— ユーザーパスワード。schema
— 非デフォルトテーブルスキーマ。オプション。on_conflict
— コンフリクト解決戦略。例:ON CONFLICT DO NOTHING
。オプション。ただし、このオプションを追加すると、挿入効率が低下します。
Named collections (バージョン21.11以降で利用可能)は、プロダクション環境での使用を推奨します。以下はその例です:
一部のパラメータはキー値引数として上書きできます:
Implementation Details
PostgreSQL側のSELECT
クエリは、読み取り専用のPostgreSQLトランザクション内でCOPY (SELECT ...) TO STDOUT
として実行され、各SELECT
クエリの後にコミットされます。
=
, !=
, >
, >=
, <
, <=
, IN
などの単純なWHERE
句は、PostgreSQLサーバーで実行されます。
すべての結合、集計、ソート、IN [ array ]
条件、およびLIMIT
サンプリング制約は、PostgreSQLへのクエリが終了した後にClickHouse内でのみ実行されます。
PostgreSQL側のINSERT
クエリは、PostgreSQLトランザクション内でCOPY "table_name" (field1, field2, ... fieldN) FROM STDIN
として実行され、各INSERT
ステートメントの後に自動コミットが行われます。
PostgreSQLのArray
タイプはClickHouseの配列に変換されます。
注意 - PostgreSQLでは、type_name[]
のように作成された配列データは、同じカラムの異なるテーブル行で異なる次元の多次元配列を含むことができます。しかし、ClickHouseでは、同じカラムのすべてのテーブル行で同じ次元数の多次元配列のみが許可されています。
複数のレプリカをサポートしており、|
でリストにする必要があります。たとえば:
PostgreSQL辞書ソースのためのレプリカの優先度もサポートされています。地図中の番号が大きいほど、優先度は低くなります。最も高い優先度は0
です。
以下の例では、レプリカexample01-1
が最高の優先度を持っています:
Usage Example
Table in PostgreSQL
Creating Table in ClickHouse, and connecting to PostgreSQL table created above
この例では、PostgreSQLテーブルエンジンを使用して、ClickHouseテーブルが上記のPostgreSQLテーブルに接続され、SELECTとINSERTステートメントの両方をPostgreSQLデータベースに対して使用します:
Inserting initial data from PostgreSQL table into ClickHouse table, using a SELECT query
postgresqlテーブル関数は、データをPostgreSQLからClickHouseにコピーします。これは、PostgreSQLではなくClickHouseでデータのクエリや分析を行うことでクエリパフォーマンスを向上させるためによく使用されるか、PostgreSQLからClickHouseへのデータ移行にも使用できます。PostgreSQLからClickHouseへデータをコピーするため、ClickHouseでMergeTreeテーブルエンジンを使用し、これをpostgresql_copyと呼びます:
Inserting incremental data from PostgreSQL table into ClickHouse table
初期の挿入の後、PostgreSQLテーブルとClickHouseテーブルの間で継続的な同期を行う場合、ClickHouseでWHERE句を使用して、タイムスタンプまたはユニークなシーケンスIDに基づいてPostgreSQLに追加されたデータのみを挿入できます。
これには、以前に追加された最大IDまたはタイムスタンプを追跡する必要があります。たとえば、以下のようにします:
その後、最大より大きいPostgreSQLテーブルから値を挿入します。
Selecting data from the resulting ClickHouse table
Using Non-default Schema
See Also