メインコンテンツへスキップ
ClickHouse Managed Postgres は、NVMe ストレージを採用したエンタープライズ向けの Postgres で、EBS のようなネットワーク接続型ストレージと比べて、ディスク I/O がボトルネックになるワークロードで最大 10 倍高速なパフォーマンスを発揮します。このクイックスタートは次の 2 部構成です。
  • 第1部: NVMe Postgres を使い始め、そのパフォーマンスを体験する
  • 第2部: ClickHouse と統合してリアルタイム分析を実現する
Managed Postgres は現在 AWS の複数のリージョンで利用でき、プライベートプレビュー期間中は無料です。 このクイックスタートで行うこと:
  • NVMe による高性能を備えた Managed Postgres インスタンスを作成する
  • 100 万件のサンプルイベントをロードし、NVMe の速度を実際に確認する
  • クエリを実行し、低レイテンシのパフォーマンスを体感する
  • リアルタイム分析のためにデータを ClickHouse にレプリケートする
  • pg_clickhouse を使用して Postgres から ClickHouse に直接クエリを実行する

第1部: NVMe Postgres を始める

データベースを作成する

新しいManaged Postgres サービスを作成するには、Cloud Console のサービス一覧で New service ボタンをクリックします。続いて、データベースの種類として Postgres を選択します。 データベースインスタンスの名前を入力し、Create service をクリックします。すると、概要ページが表示されます。 Managed Postgres インスタンスのプロビジョニングが行われ、3〜5 分で使用可能になります。

データベースに接続する

左側のサイドバーに Connect ボタン があります。これをクリックすると、接続情報と複数のフォーマットの接続文字列を確認できます。 psql の接続文字列をコピーして、データベースに接続します。DBeaver などの Postgres 互換クライアントや、各種アプリケーションライブラリも使用できます。

NVMe のパフォーマンスを体感する

NVMe によるパフォーマンスを実際に確認してみましょう。まず、クエリの実行時間を測定できるよう、psql でタイミング計測を有効にします。
\timing
イベント用とユーザー用のサンプルテーブルを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)
NVMe パフォーマンスJSONB データを含む 100 万行を 4 秒未満で挿入。EBS のようなネットワーク接続型ストレージを使用する従来のクラウドデータベースでは、ネットワーク往復遅延と IOPS のスロットリングにより、同じ操作に通常 2〜3 倍の時間がかかります。NVMeストレージは、ストレージをコンピュートに物理的に直結することで、こうしたボトルネックを解消します。パフォーマンスは、インスタンスサイズ、現在の負荷、データ特性によって異なります。
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 ms
JSONB フィルタリングと日付範囲を使ったクエリ:
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
Postgres の準備ができましたこれで、トランザクション処理のワークロードに対応できる、完全に機能する高性能な Postgres データベースを利用できます。第2部 に進み、ClickHouse のネイティブ連携によって分析機能をどのように大幅に強化できるかをご確認ください。

第2部: ClickHouse でリアルタイム分析を追加する

Postgres はトランザクションワークロード (OLTP) に優れる一方、ClickHouse は大規模なデータセットに対する分析クエリ (OLAP) 向けに特化して設計されています。この 2 つを組み合わせることで、両方の長所を活かせます。
  • アプリケーションのトランザクションデータ (挿入、更新、ポイントルックアップ) には Postgres
  • 数十億行規模のデータに対するサブ秒レベルの分析には ClickHouse
このセクションでは、Postgres のデータを ClickHouse にレプリケートし、それをシームレスにクエリする方法を紹介します。

ClickHouse 連携の設定

Postgres にテーブルとデータが入ったので、次は分析のためにそれらのテーブルを ClickHouse にレプリケートします。まず、サイドバーで ClickHouse 連携 をクリックします。次に Replicate data in ClickHouse をクリックします。 続いて表示されるフォームで、インテグレーション名を入力し、レプリケート先の既存の ClickHouse インスタンスを選択できます。まだ ClickHouse インスタンスがない場合は、このフォームから直接作成できます。
重要先に進む前に、選択した ClickHouse サービスが Running になっていることを確認してください。
Next をクリックすると、テーブルピッカーに移動します。ここで行うことは次のとおりです。
  • レプリケート先の ClickHouse データベースを選択します。
  • public スキーマを展開し、先ほど作成した users テーブルと events テーブルを選択します。
  • Replicate data to ClickHouse をクリックします。
レプリケーションが開始され、インテグレーションの概要ページに移動します。初めてのインテグレーションであるため、初期インフラストラクチャのセットアップには 2〜3 分かかることがあります。その間に、新しい pg_clickhouse 拡張機能を見てみましょう。

Postgres から ClickHouse をクエリする

pg_clickhouse 拡張機能を使うと、標準 SQL で Postgres から ClickHouse のデータを直接クエリできます。つまり、アプリケーションは Postgres を、トランザクションデータと分析データの両方に対応する統一的なクエリレイヤーとして利用できます。詳細は、完全なドキュメントを参照してください。 拡張機能を有効にします:
CREATE EXTENSION pg_clickhouse;
次に、ClickHouse への foreign server 接続を作成します。セキュアな接続には、ポート 8443http ドライバーを使用します。
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 テーブルを参照できます。
\det+ organization.*

分析データが反映されていることを確認する

インテグレーションのページに戻って確認しましょう。初回のレプリケーションが完了しているはずです。詳細を表示するには、インテグレーション名をクリックします。 サービス名をクリックして ClickHouse Console を開き、レプリケートテーブルを確認します。

Postgres と ClickHouse のパフォーマンスを比較する

それでは、いくつかの分析クエリを実行して、Postgres と ClickHouse のパフォーマンスを比較してみましょう。レプリケートテーブルでは、public_<table_name> という命名規則が使われる点に注意してください。 クエリ 1: アクティビティ別の上位ユーザー このクエリは、複数の集計を使って最もアクティブなユーザーを抽出します。
-- 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   -- Postgresで同じクエリを実行した場合
クエリ 2: 国別およびプラットフォーム別のユーザーエンゲージメント このクエリでは、events と users を結合し、エンゲージメントのメトリクスを算出します:
-- 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  -- Postgresで同じクエリを実行した場合
パフォーマンス比較:
QueryPostgres (NVMe)ClickHouse (via pg_clickhouse)Speedup
上位ユーザー (5つの集計)555 ms164 ms3.4x
ユーザーエンゲージメント (JOIN + 集計)1,246 ms170 ms7.3x
ClickHouseを使うべきケースこの100万行のデータセットでも、ClickHouseはJOINや複数の集計を含む複雑な分析クエリで3〜7倍高速です。規模がさらに大きくなると (1億行以上) 、その差はより顕著になり、ClickHouseの列指向ストレージとベクトル化実行によって10〜100倍の高速化が期待できます。クエリ時間は、インスタンスのサイズ、サービス間のネットワークレイテンシ、データの特性、現在の負荷によって変動します。

クリーンアップ

このクイックスタートで作成したリソースを削除するには、次の手順を実行します。
  1. まず、ClickHouseサービスから ClickPipe インテグレーションを削除します
  2. 次に、Cloud Console から Managed Postgres インスタンスを削除します
最終更新日 2026年6月10日