メインコンテンツまでスキップ
メインコンテンツまでスキップ

PostgreSQL テーブルエンジン

PostgreSQLエンジンは、リモートのPostgreSQLサーバーに保存されたデータに対して、SELECTおよびINSERTクエリを使用することを許可します。

注記

現在、サポートされているのはPostgreSQLバージョン12以降のみです。

Postgresデータの複製または移行にPeerDBを使用する

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テーブルからデータを選択する

非デフォルトスキーマを使用する

関連事項