ClickHouse Managed Postgres は、NVMe ストレージを基盤とするエンタープライズグレードの Postgres で、EBS のようなネットワーク接続ストレージと比べてディスクバウンドなワークロードで最大 10 倍の高速化を実現します。このクイックスタートは次の2つのパートに分かれています:
- 第1部: NVMe Postgres を使い始め、そのパフォーマンスを体感する
- 第2部: ClickHouse と統合してリアルタイム分析を実現する
ClickHouse Managed Postgres は現在、AWS の複数のリージョンで利用可能であり、パブリックベータ版として提供されています。
このクイックスタートでは、以下を行います:
- NVMe による高性能を備えた Managed Postgres インスタンスを作成
- 100万件のサンプルイベントを読み込み、NVMe の速度を実際に確認
- クエリを実行し、低レイテンシのパフォーマンスを体感
- リアルタイム分析のためにデータを ClickHouse にレプリケート
pg_clickhouseを使用して、Postgres から ClickHouse に直接クエリ
第1部: NVMe Postgres を使い始める
データベースを作成する
新しい ClickHouse Managed Postgres サービスを作成するには、Cloud Console のサービス一覧にある New service ボタンをクリックします。その後、データベースタイプとして Postgres を選択できます。

データベースインスタンスの名前を入力し、Create service をクリックします。概要ページに移動します。

ClickHouse Managed Postgres インスタンスは 3~5 分で準備が完了し、使用できるようになります。
データベースに接続する
左側のサイドバーにConnectボタンが表示されます。クリックすると、接続の詳細と複数の形式の接続文字列を表示できます。

psql の接続文字列をコピーして、データベースに接続します。DBeaver などの Postgres 互換クライアントや、任意のアプリケーションライブラリを使用することもできます。
NVMe のパフォーマンスを体感する
NVMe によるパフォーマンスを実際に確認してみましょう。まず、クエリの実行時間を測定できるよう、psql でタイミング計測を有効にします。
\イベント用とユーザー用のサンプルテーブルを2つ作成します。
CREATE TABLE events (
event_id SERIAL PRIMARY KEY,
event_name VARCHAR(255) NOT NULL,
event_type VARCHAR(100),
event_timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
event_data JSONB,
user_id INT,
user_ip INET,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE users (
user_id SERIAL PRIMARY KEY,
name VARCHAR(100),
country VARCHAR(50),
platform VARCHAR(50)
);それでは、100万件のイベントを挿入して、NVMeの速度を見てみましょう:
INSERT INTO events (event_name, event_type, event_timestamp, event_data, user_id, user_ip)
SELECT
'Event ' || gs::text AS event_name,
CASE
WHEN random() < 0.5 THEN 'click'
WHEN random() < 0.75 THEN 'view'
WHEN random() < 0.9 THEN 'purchase'
WHEN random() < 0.98 THEN 'signup'
ELSE 'logout'
END AS event_type,
NOW() - INTERVAL '1 day' * (gs % 365) AS event_timestamp,
jsonb_build_object('key', 'value' || gs::text, 'additional_info', 'info_' || (gs % 100)::text) AS event_data,
GREATEST(1, LEAST(1000, FLOOR(POWER(random(), 2) * 1000) + 1)) AS user_id,
('192.168.1.' || ((gs % 254) + 1))::inet AS user_ip
FROM
generate_series(1, 1000000) gs;INSERT 0 1000000
Time: 3596.542 ms (00:03.597)1,000 人のユーザーを挿入します:
INSERT INTO users (name, country, platform)
SELECT
first_names[first_idx] || ' ' || last_names[last_idx] AS name,
CASE
WHEN random() < 0.25 THEN 'India'
WHEN random() < 0.5 THEN 'USA'
WHEN random() < 0.7 THEN 'Germany'
WHEN random() < 0.85 THEN 'China'
ELSE 'Other'
END AS country,
CASE
WHEN random() < 0.2 THEN 'iOS'
WHEN random() < 0.4 THEN 'Android'
WHEN random() < 0.6 THEN 'Web'
WHEN random() < 0.75 THEN 'Windows'
WHEN random() < 0.9 THEN 'MacOS'
ELSE 'Linux'
END AS platform
FROM
generate_series(1, 1000) AS seq
CROSS JOIN LATERAL (
SELECT
array['Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank', 'Grace', 'Hank', 'Ivy', 'Jack', 'Liam', 'Olivia', 'Noah', 'Emma', 'Sophia', 'Benjamin', 'Isabella', 'Lucas', 'Mia', 'Amelia', 'Aarav', 'Riya', 'Arjun', 'Ananya', 'Wei', 'Li', 'Huan', 'Mei', 'Hans', 'Klaus', 'Greta', 'Sofia'] AS first_names,
array['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis', 'Martinez', 'Taylor', 'Anderson', 'Thomas', 'Jackson', 'White', 'Harris', 'Martin', 'Thompson', 'Moore', 'Lee', 'Perez', 'Sharma', 'Patel', 'Gupta', 'Reddy', 'Zhang', 'Wang', 'Chen', 'Liu', 'Schmidt', 'Müller', 'Weber', 'Fischer'] AS last_names,
1 + (seq % 32) AS first_idx,
1 + ((seq / 32)::int % 32) AS last_idx
) AS names;データに対してクエリを実行する
それでは、NVMe ストレージを使用した場合に Postgres がどれほど高速に応答するか、いくつかのクエリを実行して確認してみましょう。
100万件のイベントをタイプ別に集計する:
SELECT event_type, COUNT(*) as count
FROM events
GROUP BY event_type
ORDER BY count DESC; event_type | count
------------+--------
click | 499523
view | 375644
purchase | 112473
signup | 12117
logout | 243
(5 rows)
Time: 114.883 msJSONB フィルタリングと日付範囲を使用したクエリ:
SELECT COUNT(*)
FROM events
WHERE event_timestamp > NOW() - INTERVAL '30 days'
AND event_data->>'additional_info' LIKE 'info_5%'; count
-------
9042
(1 row)
Time: 109.294 msイベントとユーザーを結合する:
SELECT u.country, COUNT(*) as events, AVG(LENGTH(e.event_data::text))::int as avg_json_size
FROM events e
JOIN users u ON e.user_id = u.user_id
GROUP BY u.country
ORDER BY events DESC; country | events | avg_json_size
---------+--------+---------------
USA | 383748 | 52
India | 255990 | 52
Germany | 223781 | 52
China | 127754 | 52
Other | 8727 | 52
(5 rows)
Time: 224.670 ms第2部: ClickHouse でリアルタイム分析を追加する
Postgres はトランザクション系ワークロード (OLTP) に優れている一方、ClickHouse は大規模データセットに対する分析クエリ (OLAP) 向けに特化して設計されています。両者を統合することで、双方の利点を享受できます:
- アプリケーションのトランザクションデータ (挿入、更新、ポイントルックアップ) には Postgres
- 数十億行規模のデータに対するサブ秒の分析には ClickHouse
このセクションでは、Postgres のデータを ClickHouse にレプリケーションし、シームレスにクエリを実行する方法を説明します。
ClickHouse 連携のセットアップ
Postgres にテーブルとデータが揃ったので、分析のためにテーブルを ClickHouse にレプリケートしましょう。まず、サイドバーの Sync to ClickHouse をクリックします。次に、Replicate data in ClickHouse をクリックします。

次のフォームでは、インテグレーションの名前を入力し、レプリケーション先となる既存の ClickHouse インスタンスを選択できます。ClickHouse インスタンスをまだお持ちでない場合は、このフォームから直接作成できます。

次へをクリックすると、テーブルピッカーに移動します。ここで必要な操作は以下のとおりです:
- レプリケート先の ClickHouse データベースを選択します。
- public スキーマを展開し、先ほど作成した users テーブルと events テーブルを選択します。
- Replicate data to ClickHouse をクリックします。

レプリケーションプロセスが開始され、インテグレーションの概要ページに移動します。初回のインテグレーションでは、初期インフラストラクチャのセットアップに2〜3分かかる場合があります。その間に、新しい pg_clickhouse 拡張機能を確認してみましょう。
Postgres から ClickHouse をクエリする
pg_clickhouse 拡張機能を使用すると、Standard SQL を使って Postgres から直接 ClickHouse のデータをクエリできます。これにより、アプリケーションはトランザクションデータと分析データの両方に対して、Postgres を統合クエリレイヤーとして利用できます。詳細については、完全なドキュメントを参照してください。
拡張機能を有効にします:
CREATE EXTENSION pg_clickhouse;次に、ClickHouse への foreign server 接続を作成します。セキュアな接続にはポート 8443 を使用する http ドライバーを指定します:
CREATE SERVER ch FOREIGN DATA WRAPPER clickhouse_fdw
OPTIONS(driver 'http', host '<clickhouse_cloud_host>', dbname '<database_name>', port '8443');<clickhouse_cloud_host> をご使用の ClickHouse のホスト名に、<database_name> をレプリケーション設定時に選択したデータベース名に置き換えてください。ホスト名は、サイドバーの Connect をクリックすることで ClickHouse サービス上で確認できます。

次に、Postgres ユーザーを ClickHouse サービスの認証情報にマップします:
CREATE USER MAPPING FOR CURRENT_USER SERVER ch
OPTIONS (user 'default', password '<clickhouse_password>');次に、ClickHouse のテーブルを Postgres のスキーマにインポートします。
CREATE SCHEMA organization;
IMPORT FOREIGN SCHEMA "<database_name>" FROM SERVER ch INTO organization;<database_name> には、サーバーの作成時に使用したデータベース名と同じ名前を指定してください。
これで、Postgres クライアントですべての ClickHouse テーブルを確認できます:
\分析機能を実際に確認する
インテグレーションページに戻って確認しましょう。初期レプリケーションが完了しているはずです。詳細を表示するには、インテグレーション名をクリックしてください。

サービス名をクリックして ClickHouse コンソールを開き、レプリケートテーブルを確認します。

Postgres と ClickHouse のパフォーマンスを比較する
次に、いくつかの分析クエリを実行して、Postgres と ClickHouse のパフォーマンスを比較してみましょう。なお、レプリケートされたテーブルは public_<table_name> という命名規則を使用します。
クエリ 1: アクティビティ別上位ユーザー
このクエリは、複数の集計を用いて最もアクティブなユーザーを見つけます。
-- Via ClickHouse
SELECT
user_id,
COUNT(*) as total_events,
COUNT(DISTINCT event_type) as unique_event_types,
SUM(CASE WHEN event_type = 'purchase' THEN 1 ELSE 0 END) as purchases,
MIN(event_timestamp) as first_event,
MAX(event_timestamp) as last_event
FROM organization.public_events
GROUP BY user_id
ORDER BY total_events DESC
LIMIT 10; user_id | total_events | unique_event_types | purchases | first_event | last_event
---------+--------------+--------------------+-----------+----------------------------+----------------------------
1 | 31439 | 5 | 3551 | 2025-01-22 22:40:45.612281 | 2026-01-21 22:40:45.612281
2 | 13235 | 4 | 1492 | 2025-01-22 22:40:45.612281 | 2026-01-21 22:40:45.612281
...
(10 rows)
Time: 163.898 ms -- ClickHouse
Time: 554.621 ms -- Same query on Postgresクエリ 2: 国別・プラットフォーム別のユーザーエンゲージメント
このクエリはイベントとユーザーを結合し、エンゲージメントメトリクスを計算します:
-- Via ClickHouse
SELECT
u.country,
u.platform,
COUNT(DISTINCT e.user_id) as users,
COUNT(*) as total_events,
ROUND(COUNT(*)::numeric / COUNT(DISTINCT e.user_id), 2) as events_per_user,
SUM(CASE WHEN e.event_type = 'purchase' THEN 1 ELSE 0 END) as purchases
FROM organization.public_events e
JOIN organization.public_users u ON e.user_id = u.user_id
GROUP BY u.country, u.platform
ORDER BY total_events DESC
LIMIT 10; country | platform | users | total_events | events_per_user | purchases
---------+----------+-------+--------------+-----------------+-----------
USA | Android | 115 | 109977 | 956 | 12388
USA | Web | 108 | 105057 | 972 | 11847
USA | iOS | 83 | 84594 | 1019 | 9565
Germany | Android | 85 | 77966 | 917 | 8852
India | Android | 80 | 68095 | 851 | 7724
...
(10 rows)
Time: 170.353 ms -- ClickHouse
Time: 1245.560 ms -- Same query on Postgresパフォーマンス比較:
| クエリ | Postgres (NVMe) | ClickHouse (via pg_clickhouse) | 高速化倍率 |
|---|---|---|---|
| 上位ユーザー (5つの集計) | 555 ms | 164 ms | 3.4x |
| ユーザーエンゲージメント (JOIN + 集計) | 1,246 ms | 170 ms | 7.3x |
クリーンアップ
このクイックスタートで作成したリソースを削除するには:
- まず、ClickHouse サービスから ClickPipe インテグレーションを削除します
- 次に、Cloud Console から ClickHouse Managed Postgres インスタンスを削除します
この方法は、自分で進めても、スクリプト化しても、AI Agent に任せてもかまいません。コンソール版を使う場合は、Cloud UI 表示に切り替えてください。
このページでは、ClickHouse CLI (clickhousectl) と psql を使って、ClickHouse Managed Postgres のプロビジョニング、データの読み込み、ClickHouse へのレプリケーション、クエリの実行を、すべてコマンドラインから行う方法を説明します。コマンドは非対話型で、clickhousectl は --json を指定すると JSON を出力します。
前提条件
ClickHouse CLIをインストールします:
curl https://clickhouse.com/cli | shpsql (PostgreSQL client ツール。macOS では brew install libpq) と jq も必要です。
書き込み操作 (作成、削除) には API key 認証 が必要です。OAuth ログインは読み取り専用です:
clickhousectl cloud auth login --api-key <YOUR_KEY> --api-secret <YOUR_SECRET>または、環境変数 CLICKHOUSE_CLOUD_API_KEY と CLICKHOUSE_CLOUD_API_SECRET を設定します。clickhousectl cloud auth status で確認し、スコープが read/write のエントリが表示されることを確認してください。
第1部: Postgresを作成し、データを読み込む
Postgresサービスを作成する
サービスを作成し、レスポンスを保存します。パスワードは一度しか表示されません:
clickhousectl cloud postgres create \
--name quickstart-pg \
--region us-east-1 \
--size m6gd.large \
--pg-version 18 \
--json > pg.jsonレスポンスには、サービス ID、ホスト名、すぐに使える接続文字列が含まれます。
{
"id": "3b5a3112-bf02-82d0-bd02-fbe67d5caa7a",
"name": "quickstart-pg",
"provider": "aws",
"region": "us-east-1",
"postgresVersion": "18",
"size": "m6gd.large",
"storageSize": 118,
"haType": "none",
"state": "creating",
"createdAt": "2026-07-22T13:21:22Z",
"hostname": "quickstart-pg-c1406b50.pg7dd324nz0a1qm1fqskxbjn7m.c0.us-east-1.aws.pg.clickhouse.cloud",
"username": "postgres",
"password": "vV6cfEr2p_-TzkCDrZOx",
"connectionString": "postgres://postgres:vV6cfEr2p_-TzkCDrZOx@quickstart-pg-c1406b50.pg7dd324nz0a1qm1fqskxbjn7m.c0.us-east-1.aws.pg.clickhouse.cloud:5432/postgres?channel_binding=require",
"isPrimary": true,
"tags": []
}このガイドの以降で必要になる情報を抽出します:
PG_ID=$(jq -r .id pg.json)
PG_URL=$(jq -r .connectionString pg.json)パスワードを紛失した場合は、clickhousectl cloud postgres reset-password $PG_ID --generate で新しいパスワードを生成します。
サービスの Provisioning が完了するまで待機する
Provisioning には数分かかります。状態が running になるまでポーリングしてください:
while [ "$(clickhousectl cloud postgres get "$PG_ID" --json | jq -r .state)" != "running" ]; do
sleep 15
doneサンプルデータを読み込む
2 つのテーブルを作成し、psql を使って 100 万件のイベントを挿入します:
psql "$PG_URL" <<'SQL'
\timing
CREATE TABLE events (
event_id SERIAL PRIMARY KEY,
event_name VARCHAR(255) NOT NULL,
event_type VARCHAR(100),
event_timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
event_data JSONB,
user_id INT,
user_ip INET,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE users (
user_id SERIAL PRIMARY KEY,
name VARCHAR(100),
country VARCHAR(50),
platform VARCHAR(50)
);
INSERT INTO events (event_name, event_type, event_timestamp, event_data, user_id, user_ip)
SELECT
'Event ' || gs::text AS event_name,
CASE
WHEN random() < 0.5 THEN 'click'
WHEN random() < 0.75 THEN 'view'
WHEN random() < 0.9 THEN 'purchase'
WHEN random() < 0.98 THEN 'signup'
ELSE 'logout'
END AS event_type,
NOW() - INTERVAL '1 day' * (gs % 365) AS event_timestamp,
jsonb_build_object('key', 'value' || gs::text, 'additional_info', 'info_' || (gs % 100)::text) AS event_data,
GREATEST(1, LEAST(1000, FLOOR(POWER(random(), 2) * 1000) + 1)) AS user_id,
('192.168.1.' || ((gs % 254) + 1))::inet AS user_ip
FROM
generate_series(1, 1000000) gs;
INSERT INTO users (name, country, platform)
SELECT
first_names[first_idx] || ' ' || last_names[last_idx] AS name,
CASE
WHEN random() < 0.25 THEN 'India'
WHEN random() < 0.5 THEN 'USA'
WHEN random() < 0.7 THEN 'Germany'
WHEN random() < 0.85 THEN 'China'
ELSE 'Other'
END AS country,
CASE
WHEN random() < 0.2 THEN 'iOS'
WHEN random() < 0.4 THEN 'Android'
WHEN random() < 0.6 THEN 'Web'
WHEN random() < 0.75 THEN 'Windows'
WHEN random() < 0.9 THEN 'MacOS'
ELSE 'Linux'
END AS platform
FROM
generate_series(1, 1000) AS seq
CROSS JOIN LATERAL (
SELECT
array['Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank', 'Grace', 'Hank', 'Ivy', 'Jack', 'Liam', 'Olivia', 'Noah', 'Emma', 'Sophia', 'Benjamin', 'Isabella', 'Lucas', 'Mia', 'Amelia', 'Aarav', 'Riya', 'Arjun', 'Ananya', 'Wei', 'Li', 'Huan', 'Mei', 'Hans', 'Klaus', 'Greta', 'Sofia'] AS first_names,
array['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis', 'Martinez', 'Taylor', 'Anderson', 'Thomas', 'Jackson', 'White', 'Harris', 'Martin', 'Thompson', 'Moore', 'Lee', 'Perez', 'Sharma', 'Patel', 'Gupta', 'Reddy', 'Zhang', 'Wang', 'Chen', 'Liu', 'Schmidt', 'Müller', 'Weber', 'Fischer'] AS last_names,
1 + (seq % 32) AS first_idx,
1 + ((seq / 32)::int % 32) AS last_idx
) AS names;
SQLTiming is on.
CREATE TABLE
Time: 86.029 ms
CREATE TABLE
Time: 80.962 ms
INSERT 0 1000000
Time: 7120.357 ms (00:07.120)
INSERT 0 1000
Time: 84.807 msNVMeストレージにより、100万行の insert は m6gd.large (最小サイズ) で約7秒で完了します。クエリで確認してください。データは random() で生成されるため、行数は実行のたびに異なります。
psql "$PG_URL" -c "SELECT event_type, COUNT(*) FROM events GROUP BY event_type ORDER BY 2 DESC;"第2部: ClickHouse にレプリケートする
ClickHouse サービスを作成する
同じリージョンにサービスを作成し、レスポンスを保存します。パスワードは作成時のレスポンスにのみ表示されます。
clickhousectl cloud service create \
--name quickstart-ch \
--region us-east-1 \
--json > ch.json
CH_ID=$(jq -r .service.id ch.json)
CH_PASSWORD=$(jq -r .password ch.json)稼働状態になるまで待機してください。ClickPipe には稼働中の宛先が必要です:
while [ "$(clickhousectl cloud service get "$CH_ID" --json | jq -r .state)" != "running" ]; do
sleep 15
done代わりに既存のサービスを使用する場合は、clickhousectl cloud service list で取得した CH_ID を設定し、CH_PASSWORD にはその default ユーザーのパスワードを設定します。これは pg_clickhouse のステップで必要です。
テーブルを ClickHouse にレプリケートする
ClickHouse サービス 上に、ClickHouse Managed Postgres の ホスト名 を指定した Postgres CDC ClickPipe を作成します。このパイプは既存の行をコピーし、その後も継続的な変更に合わせて ClickHouse を同期した状態に保ちます。
PG_HOST=$(jq -r .hostname pg.json)
PG_PASSWORD=$(jq -r .password pg.json)
clickhousectl cloud clickpipe create postgres "$CH_ID" \
--name quickstart-sync \
--host "$PG_HOST" \
--pg-database postgres \
--username postgres \
--password "$PG_PASSWORD" \
--table-mapping public.events:public_events \
--table-mapping public.users:public_users \
--json > pipe.json
PIPE_ID=$(jq -r .id pipe.json)注意:
- レプリケートテーブルは ClickHouse サービス 上の
defaultデータベースに作成され、名前は--table-mappingのターゲットで指定したものになります publicationとreplication slotは自動的に作成され、publicationの対象はマップされたテーブルに限定されます。自分で管理するものを使う場合は--publication-nameを指定してください- Postgres の ホスト名 は直接指定してください。PgBouncer 経由のレプリケーションはサポートされていません
パイプがRunningになるまで待機します
パイプはRunningに到達するまでに、Provisioning、Setup、 (大きなテーブルの場合は) Snapshotを経由します。サービス上の最初のパイプでは、これに約4分かかります。FailedとInternalErrorは終端状態です:
while :; do
STATE=$(clickhousectl cloud clickpipe get "$CH_ID" "$PIPE_ID" --json | jq -r .state)
case "$STATE" in
Running) break ;;
Failed|InternalError) echo "ClickPipe entered terminal state: $STATE" >&2; exit 1 ;;
esac
sleep 15
doneClickHouse でレプリケートされたデータにクエリを実行する
CLI から ClickHouse サービスに直接 SQL を実行します。最初の呼び出しで、Query API エンドポイントとサービス スコープの API キーが自動的に作成されます:
clickhousectl cloud service query --id "$CH_ID" \
--query "SELECT count() FROM public_events"Provisioning Query API endpoint + key for service 'quickstart-ch'...
1000000Postgres への新しい書き込みは継続的にレプリケートされます。1 行を挿入し、件数が 1,000,001 に達するまでポーリングしてください (通常は 1 分未満です) :
psql "$PG_URL" -c "INSERT INTO events (event_name, event_type, user_id, user_ip) VALUES ('cdc-test', 'click', 42, '10.0.0.1');"
while [ "$(clickhousectl cloud service query --id "$CH_ID" \
--query "SELECT count() FROM public_events")" != "1000001" ]; do
sleep 10
donePostgres から ClickHouse をクエリする
pg_clickhouse 拡張機能を使うと、Postgres をトランザクションデータと分析データの両方に対応する統合クエリレイヤーとして利用できます。ClickHouse の HTTPS ホスト名を取得し、psql でこの拡張機能を設定します。
CH_HOST=$(clickhousectl cloud service get "$CH_ID" --json \
| jq -r '.endpoints[] | select(.protocol=="https") | .host')
psql "$PG_URL" <<SQL
CREATE EXTENSION pg_clickhouse;
CREATE SERVER ch FOREIGN DATA WRAPPER clickhouse_fdw
OPTIONS(driver 'http', host '$CH_HOST', dbname 'default', port '8443');
CREATE USER MAPPING FOR CURRENT_USER SERVER ch
OPTIONS (user 'default', password '$CH_PASSWORD');
CREATE SCHEMA organization;
IMPORT FOREIGN SCHEMA "default" FROM SERVER ch INTO organization;
SQLヒアドキュメントは意図的にクォートしていないため、SQL が Postgres に届く前に、シェルが $CH_HOST と $CH_PASSWORD を展開します。これで、レプリケートテーブルが organization スキーマ内の外部テーブルとして参照できるようになり、それらに対するクエリは ClickHouse で実行されます。
このデータセットを m6gd.large で測定したところ、分析クエリは外部テーブル経由のほうが 6~9 倍高速でした (たとえば、5 つの集計を含む GROUP BY は ClickHouse 経由で 176 ms、ローカルでは 1,133 ms、集計を伴う JOIN は 298 ms、ローカルでは 2,764 ms) 。
クリーンアップ
まず ClickPipe を削除し、次に Postgres サービスを削除します。サービスを削除すると、そのサービス内のすべてのデータが完全に削除されます。
clickhousectl cloud clickpipe delete "$CH_ID" "$PIPE_ID"
clickhousectl cloud postgres delete "$PG_ID"稼働中の ClickHouse サービス は直接削除できません。いったん停止し、stopped になるのを待ってから削除してください。
clickhousectl cloud service stop "$CH_ID"
while [ "$(clickhousectl cloud service get "$CH_ID" --json | jq -r .state)" != "stopped" ]; do
sleep 10
done
clickhousectl cloud service delete "$CH_ID"