PostgreSQL テーブルエンジン
PostgreSQLエンジンは、リモートのPostgreSQLサーバーに保存されたデータに対して、SELECT
およびINSERT
クエリを使用することを許可します。
現在、サポートされているのはPostgreSQLバージョン12以降のみです。
Postgresテーブルエンジンに加えて、ClickHouseのPeerDBを使用して、PostgresからClickHouseへの継続的なデータパイプラインを設定できます。PeerDBは、変更データキャプチャ(CDC)を使用してPostgresからClickHouseにデータを複製するために特別に設計されたツールです。
テーブルの作成
CREATE TABLEクエリの詳細な説明を参照してください。
テーブル構造は元のPostgreSQLテーブル構造と異なる場合があります:
- カラム名は元のPostgreSQLテーブルと同じである必要がありますが、これらのカラムの一部のみを使用することができ、順序も任意です。
- カラムタイプは元のPostgreSQLテーブルのものとは異なる場合があります。ClickHouseは値をClickHouseのデータ型にキャストしようとします。
- external_table_functions_use_nulls設定はNullableカラムの処理方法を定義します。デフォルト値は1です。0の場合、テーブル関数はNullableカラムを作成せず、nullの代わりにデフォルト値を挿入します。これは、配列内のNULL値にも適用されます。
エンジンパラメータ
host:port
— PostgreSQLサーバーのアドレス。database
— リモートデータベース名。table
— リモートテーブル名。user
— PostgreSQLユーザー。password
— ユーザーパスワード。schema
— 非デフォルトのテーブルスキーマ。オプション。on_conflict
— コンフリクト解決戦略。例:ON CONFLICT DO NOTHING
。オプション。注:このオプションを追加すると、挿入の効率が低下します。
Named collections(バージョン21.11以降利用可能)は、プロダクション環境での使用が推奨されます。以下はその例です:
一部のパラメータはキー値引数で上書きできます:
実装の詳細
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
が最も高い優先度を持っています:
使用例
PostgreSQLでのテーブル
ClickHouseでのテーブル作成と上記のPostgreSQLテーブルへの接続
この例では、ClickHouseテーブルをPostgreSQLテーブルに接続し、PostgreSQLデータベースに対してSELECT
およびINSERT
ステートメントの両方を使用するためにPostgreSQLテーブルエンジンを使用します:
SELECTクエリを使用してPostgreSQLテーブルからClickHouseテーブルに初期データを挿入する
postgresqlテーブル関数は、PostgreSQLからClickHouseにデータをコピーします。これは、PostgreSQLではなくClickHouseでデータをクエリしたり分析したりすることでデータのクエリ性能を改善するためによく使用され、またPostgreSQLからClickHouseへのデータ移行にも使用できます。PostgreSQLからClickHouseにデータをコピーするために、ClickHouseではMergeTreeテーブルエンジンを使用し、それをpostgresql_copyと呼びます:
PostgreSQLテーブルからClickHouseテーブルへのインクリメンタルデータを挿入する
初期挿入後、PostgreSQLテーブルとClickHouseテーブルの間で継続的な同期を行う場合、ClickHouseでWHERE句を使用して、タイムスタンプまたは一意のシーケンスIDに基づいてPostgreSQLに追加されたデータのみを挿入できます。
このためには、以前に追加された最大IDまたはタイムスタンプを追跡する必要があります。以下のように:
そして、最大より大きいPostgreSQLテーブルから値を挿入します。
結果として得られたClickHouseテーブルからデータを選択する
非デフォルトスキーマを使用する
関連事項