---
title: "chdb Postgres 拡張のご紹介: クラウドストレージからの高性能なインポート"
date: "2026-09-16T09:51:13.160Z"
author: "David Wheeler"
category: "Product"
excerpt: "chdb Postgres 拡張を使うと、組み込みの ClickHouse エンジンにより、クラウドストレージの各種プラットフォームやデータ形式をまたいで高速にインポートし、エクスポートできます。"
---

# chdb Postgres 拡張のご紹介: クラウドストレージからの高性能なインポート

新しい Postgres 拡張 [chdb](https://pgxn.org/dist/chdb/) を発表できることをうれしく思います。この拡張は、インプロセスの
[ClickHouse](https://github.com/ClickHouse/ClickHouse) エンジンである [chDB ライブラリ](https://clickhouse.com/docs/chdb) を使って、Postgres の
インポートとエクスポートの機能を広げます。お使いのクラウドストレージにある多様な [データ形式](https://clickhouse.com/docs/reference/formats/index) を、
効率的かつ柔軟に相互変換できます。

## ベンチマーク {#benchmark}

ここで言う *効率的* は、誇張ではありません。いくつかのデータ形式で
[NYC タクシーデータセット](https://clickhouse.com/docs/get-started/quickstarts/tutorial)(100 万行、列数の多いテーブル)をインポートし、
[chdb](https://pgxn.org/dist/chdb/) とほかの 3 種類の Postgres 拡張の性能を比較しました。いずれも同じリージョンに配置した
[AWS S3](https://aws.amazon.com/s3/) バケットから読み込んでいます。では結果のグラフを見てみましょう。

![](https://clickhouse.com/uploads/pg_chdb_sep2026_image1_dark_f0b53a5236.png)

> 条件の差を小さくし、インフラではなく拡張自体の性能を測れるようにするため、
> [chdb](https://pgxn.org/dist/chdb/)、[pg_lake](https://github.com/Snowflake-Labs/pg_lake)、
> [pg_duckdb](https://github.com/duckdb/pg_duckdb) のベンチマークは、[ClickHouse Managed Postgres](https://clickhouse.com/cloud/postgres) の
> `r8id.xlarge` サービス(4 vCPU、32 GB RAM)で実行しました。[aws_s3](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PostgreSQL.S3Import.html) のベンチマークは、
> [AWS RDS](https://aws.amazon.com/rds/postgresql/) の `db.r8g.xlarge` ホスト(こちらも 4 vCPU、32 GB RAM)で実行しました。
> 各インポートの結果は 3 回の平均です。詳細は [ベンチマークのソースコード](https://github.com/ClickHouse/pg_chdb/blob/main/dev/benchmark/) を参照してください。

比較した 4 種類の拡張のうち、最も安定した性能を示したのは [chdb](https://pgxn.org/dist/chdb/) です。
いずれも [DuckDB](https://duckdb.org) を基盤とする [pg_duckdb](https://github.com/duckdb/pg_duckdb) と [pg_lake](https://github.com/Snowflake-Labs/pg_lake) は、CSV、JSON、Parquet からの
インポートに、およそ 2〜3 倍の時間がかかります。[chdb](https://pgxn.org/dist/chdb/) に近い性能を出すのは [aws_s3](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PostgreSQL.S3Import.html) だけですが、
aws_s3 が対応するデータ形式はかなり限られます。

## データ形式 {#data_formats}

データ形式と言えば、[chdb](https://pgxn.org/dist/chdb/) 拡張は非常に多くの形式を読み書きできます。
[ClickHouse 自体が対応する形式](https://clickhouse.com/docs/reference/formats/index)のすべてです。次の表は、
比較した各拡張が対応するデータ形式と圧縮アルゴリズムをまとめたものです。表中の [chdb](https://pgxn.org/dist/chdb/) の形式は、
[実際に対応する形式](https://clickhouse.com/docs/reference/formats/index)の一部にすぎません。

| 拡張 | 圧縮 | データ形式 |
| --------- | ------------------------------------ | -------------------------------- |
| aws_s3    | なし                                 | Text (TSV), CSV, Postgres Binary |
| pg_lake   | gzip, zstd, snappy (Parquet のみ)    | CSV, JSON, Parquet               |
| pg_duckdb | gzip, zstd, snappy (Parquet のみ)    | CSV, JSON, Parquet               |
| chdb      | gzip, zstd, lz4, bz2, snappy, brotli | TSV, CSV, JSON, BSON, Prometheus, Protobuf, Avro, Parquet, Arrow, XML, CapnProto, Markdown, MsgPack, ORC、[ほかにも多数](https://clickhouse.com/docs/reference/formats/index)! |

[ClickHouse](https://github.com/ClickHouse/ClickHouse) と [chDB ライブラリ](https://clickhouse.com/docs/chdb) が対応形式を増やせば、[chdb](https://pgxn.org/dist/chdb/) 拡張は
実装を変えることなくそれを利用できます。

これらの形式のいくつかについても、[NYC タクシーデータセット](https://clickhouse.com/docs/get-started/quickstarts/tutorial) を読み込む
[chdb](https://pgxn.org/dist/chdb/) の性能を測定しました。結果はかなり安定していました。

![](https://clickhouse.com/uploads/pg_chdb_sep2026_image2_dark_be65cf7ea0.png)

比較対象の拡張との互換性を保つため、[JSONCompact](https://clickhouse.com/docs/reference/formats/JSON/JSONCompact) 形式を使いました。
[JSONCompactEachRow](https://clickhouse.com/docs/reference/formats/JSON/JSONCompactEachRow) のような別の JSON 形式であれば、
ほかのデータ形式で得られた結果により近づきます。

## 使い方 {#usage}

[chdb](https://pgxn.org/dist/chdb/) パッケージには 2 種類の拡張が含まれます。[CREATE EXTENSION](https://www.postgresql.org/docs/current/sql-createextension.html) で導入する
chdb という拡張と、chdb_hook という [フックモジュール](https://wiki.postgresql.org/wiki/PostgresServerExtensionPoints#Hooks) です。

### chdb 拡張

chdb 拡張([ドキュメント](https://pgxn.org/dist/chdb/doc/chdb.html))は `chdb_query()` 関数を提供します。
この関数は chDB のクエリを 1 つ実行します。たとえば、次のクエリは

<pre><code type='click-ui' language='sql'>
SELECT * FROM chdb_query($$
  SELECT * FROM s3('s3://datasets-documentation/my-test-bucket-768/some_prefix/some_file_1.csv');
$$) AS (id int, months int, days int);
</code></pre>

次のように出力します。

```shell
 id | months | days
----+--------+------
  1 |      2 |    3
  3 |      2 |    1
  4 |      5 |    6
(3 rows)
```

### chdb_hook モジュール

`chdb_hook` モジュール([ドキュメント](https://pgxn.org/dist/chdb/doc/chdb_hook.html))は [COPY](https://www.postgresql.org/docs/current/sql-copy.html) コマンドにフックし、
[AWS S3](https://aws.amazon.com/s3/)、[Google Cloud Storage](https://cloud.google.com/storage)、[Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs/)、ファイル、http URL との間でデータをコピーします。次の例は、S3 上の CSV ファイルからレコードを読み込みます。

<pre><code type='click-ui' language='sql'>
CREATE TABLE times (
    id     INT NOT NULL,
    months INT NOT NULL,
    days   INT NOT NULL
);

LOAD 'chdb_hook';
COPY times FROM 's3://datasets-documentation/my-test-bucket-768/some_prefix/some_file_1.csv';
</code></pre>

実行すると、`times` テーブルにはファイルのレコードが入ります。

```shell
# SELECT * FROM times;
 id | months | days
----+--------+------
  1 |      2 |    3
  3 |      2 |    1
  4 |      5 |    6
(3 rows)
```

[CREATE TABLE](https://www.postgresql.org/docs/current/sql-createtable.html) コマンドで、こうした URL から列の定義を導き出し、行を読み込むこともできます。
次の例を試してみてください(この記事に出てくる URL は、すべて実在するデータファイルを指しています)。

<pre><code type='click-ui' language='sql'>
CREATE TABLE reviews () WITH (
    copy_from = 's3://datasets-documentation/amazon_reviews/amazon_reviews_2015.snappy.parquet'
);
</code></pre>

できあがったテーブルは、データがすべて読み込まれた状態で次の構造になります。

|      列       |     型      |
|------------------ | ------------- |
| review_date       | integer       |
| marketplace       | text          |
| customer_id       | numeric(20,0) |
| review_id         | text          |
| product_id        | text          |
| product_parent    | numeric(20,0) |
| product_title     | text          |
| product_category  | text          |
| star_rating       | smallint      |
| helpful_votes     | bigint        |
| total_votes       | bigint        |
| vine              | boolean       |
| verified_purchase | boolean       |
| review_headline   | text          |
| review_body       | text          |

## データ型 {#data_types}

[pg_clickhouse](https://clickhouse.com/docs/products/managed-postgres/extensions/pg_clickhouse/) と同じく、[chdb](https://pgxn.org/dist/chdb/) は ClickHouse から Postgres への値の変換に、
ヘッダーのみで構成されたライブラリ [pg-clickhouse-c](https://github.com/ClickHouse/pg-clickhouse-c/) を利用します。上の `CREATE TABLE` の例のように、
その [型マッピング](https://github.com/ClickHouse/pg-clickhouse-c/#type-mapping) も利用します。現在のリリースでは、ClickHouse のほぼすべての型が Postgres の型に、
またその逆にも対応付けられます。このマッピングで足りる場面がほとんどです。合わない場合は、`structure` オプションで
使用する型を [chdb](https://pgxn.org/dist/chdb/) に指定します。

たとえば [pg-clickhouse-c](https://github.com/ClickHouse/pg-clickhouse-c/) は、Postgres の JSON 値を ClickHouse の
String に対応付けます。[ClickHouse の JSON](https://clickhouse.com/docs/reference/data-types/newjson) が現時点では JSON の *オブジェクト* しか認識せず、
Postgres の JSON はオブジェクト、配列、JSON のスカラー値に対応しているためです。ただし、次のような CHECK 制約が
あれば、JSON 列にオブジェクトしか入らないと確信できます。

<pre><code type='click-ui' language='sql'>
CREATE TABLE projects (
    name   TEXT PRIMARY KEY,
    meta   JSON NOT NULL CHECK (json_typeof(meta) = 'object')
);

INSERT INTO projects
VALUES ( 'chdb',   '{"status": "release"}' ),
       ( 'walrus', '{"status": "revise"}'  );
</code></pre>

[Parquet JSON](https://parquet.apache.org/docs/file-format/types/logicaltypes/#json) のようにオブジェクトを認識できるストレージ形式では、柔軟性が高まり、格納の面でも利点があります。
これを活かすには、`structure` オプションで [ClickHouse の JSON](https://clickhouse.com/docs/reference/data-types/newjson) に対応付けます。

<pre><code type='click-ui' language='sql'>
COPY projects to 'file:///tmp/projects.parquet' (
    structure 'name String, meta JSON'
);
</code></pre>

## クラウドストレージの URL {#cloud_storage_urls}

[chdb_hook](https://pgxn.org/dist/chdb/doc/chdb_hook.html) 拡張は、主要なストレージプラットフォームとの間でデータを読み書きできます。
URL のスキームから、使用するプロトコルを判断します。

| スキーム                        | 対象                               |
| ------------------------------ | ------------------------------------ |
| `file`                         | Postgres サーバー上の絶対パス |
| `http`, `https`                | HTTP URL                             |
| `s3`                           | [AWS S3](https://aws.amazon.com/s3/)                             |
| `gs`, `gcs`, `oss`             | [Google Cloud Storage](https://cloud.google.com/storage)               |
| `az`, `azure`, `abfss`, `abfs` | [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs/) または [Azure ABFS](https://learn.microsoft.com/en-us/azure/storage/blobs/data-lake-storage-introduction-abfs-uri) |
| `hdfs`                         | [Hadoop Distributed File System](https://en.wikipedia.org/wiki/Apache_Hadoop#Overview)     |

URL にはいくつかの [ワイルドカード](https://pgxn.org/dist/chdb/doc/chdb_hook.html#Path.Wildcards) も使えるため、複数のファイルを並行して取得できます。
先ほどの `CREATE TABLE` の例に戻ると、次のコマンドは S3 から 6 個のファイルを見つけてインポートします。

<pre><code type='click-ui' language='sql'>
CREATE TABLE times () WITH (
    copy_from = 's3://datasets-documentation/my-test-bucket-768/{some,another}_prefix/some_file_{1..3}.csv'
);
</code></pre>

実行すると、`times` テーブルには読み込んだ各ファイルのレコードが入ります。

```shell
SELECT * FROM times;
 c1 | c2 | c3 
----+----+----
  1 |  2 |  3
  3 |  2 |  1
  4 |  5 |  6
  1 |  2 |  3
  3 |  2 |  1
  4 |  5 |  6
  1 |  2 |  3
  3 |  2 |  1
  4 |  5 |  6
  1 |  2 |  3
  3 |  2 |  1
  4 |  5 |  6
  1 |  2 |  3
  3 |  2 |  1
  4 |  5 |  6
  1 |  2 |  3
  3 |  2 |  1
  4 |  5 |  6
 (18 rows)
```

## アーキテクチャ {#architecture}

これほど多くのデータ形式とクラウドプラットフォームに対応するには、大量の依存関係が必要になります。
私たちはその管理を [chDB ライブラリ](https://clickhouse.com/docs/chdb) に委ね、自分たちでは抱えていません。
とはいえ、このライブラリを Postgres のバックエンドにロードするのは過剰です。1 日 1 回データソースから
データを読み込むような、ときどき実行する処理や定期的に実行する処理では特にそうです。

そのため、データを読み込む拡張は、こうしたライブラリの大きさと複雑さを扱うために、
さまざまな方法を採っています。

*   [aws_s3](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PostgreSQL.S3Import.html) はファイルをローカルファイルシステムにダウンロードし、
    あとの処理を [COPY](https://www.postgresql.org/docs/current/sql-copy.html) に任せます。そのため、対象は [AWS S3](https://aws.amazon.com/s3/) のソースと、
    Postgres の [COPY](https://www.postgresql.org/docs/current/sql-copy.html) が対応する形式に限られます
*   [pg_duckdb](https://github.com/duckdb/pg_duckdb) は [DuckDB](https://duckdb.org) エンジンを Postgres のバックエンドに組み込みます。
    たまに [COPY](https://www.postgresql.org/docs/current/sql-copy.html) を使うだけなら過剰です
*   [pg_lake](https://github.com/Snowflake-Labs/pg_lake) は [DuckDB](https://duckdb.org) を利用する別のサービスを動かし、
    [libpq プロトコル](https://www.postgresql.org/docs/current/libpq.html) 経由で通信します。このサービスは Postgres ホストの
    リソースを常に消費し続けます

[chdb 拡張](https://pgxn.org/dist/chdb/) は、独自のアーキテクチャを採っています。[chDB ライブラリ](https://clickhouse.com/docs/chdb) を
別のヘルパーアプリに組み込む方式です。拡張本体も [chdb_hook](https://pgxn.org/dist/chdb/doc/chdb_hook.html) も chDB をリンクしません。
代わりに、必要になった時点でヘルパーアプリを起動し、メモリ上の効率的な経路であるファイルディスクリプタ
(`STDIN`、`STDOUT`、`STDERR`、および設定情報用のもう 1 つ)を通じて通信します。

この設計により、[chDB ライブラリ](https://clickhouse.com/docs/chdb) が 1 つのコマンドの実行に必要な以上のリソースを
消費することはありません。また、PostgreSQL クラスター自体が [メモリ不足](https://en.wikipedia.org/wiki/Out_of_memory) の影響を受けないようにします。
[バックグラウンドワーカー](https://www.postgresql.org/docs/current/bgworker.html) で共有メモリを使う方式では、このメモリ不足が起こり得ます。

ヘルパーアプリは、コマンドの実行を終えてすべての結果をバックエンドに引き渡すと、後片付けをして終了し、
サーバーのリソースを、最も重要なサービスである PostgreSQL に明け渡します。結果は
[ClickHouse Native](https://clickhouse.com/docs/reference/formats/Native) 形式で、ソースから直接流します。

```shell
                  +-------------+
                  |   helper    |
+----------+      |    app      |      +------+
| Postgres |      | +---------+ |      | chDB |
| Backend  |<---->| |  chDB   | |<---->| Data |
+----------+      | | Library | |      +------+
                  | +---------+ |
                  +-------------+
```

## 今後の予定 {#whats_next}

私たちは [chdb](https://pgxn.org/dist/chdb/) の改善を続けます。ロードマップの候補には次の項目があります。

*   型マッピングの完成。Postgres と ClickHouse のデータ型の差を少しずつ埋めており、
    [chdb](https://pgxn.org/dist/chdb/) と [pg_clickhouse](https://clickhouse.com/docs/products/managed-postgres/extensions/pg_clickhouse/) の
    両方に役立ちます。
*   資格情報チェーンによるオブジェクトストレージへのアクセス制御。現在、オブジェクトストアの読み書きに
    必要な資格情報は、[chdb](https://pgxn.org/dist/chdb/) の呼び出しごとに明示的に渡す必要があります。
    サーバー側で設定した資格情報を透過的に使えるようにもしたいと考えています。
*   `COPY (query) TO` への対応
*   [COPY](https://www.postgresql.org/docs/current/sql-copy.html) での `WHERE` 条件への対応
*   既存の [COPY](https://www.postgresql.org/docs/current/sql-copy.html) オプションすべてへの対応
*   [Iceberg](https://iceberg.apache.org) 形式への対応
*   ストレージ上のファイルを直接クエリする機能

## 試してみる {#give_it_a_try}

[chdb 拡張](https://pgxn.org/dist/chdb/) は [GitHub](https://github.com/ClickHouse/pg_chdb) や [PGXN](https://pgxn.org/dist/chdb/) など、おなじみの配布先から入手できます。
[ClickHouse Managed Postgres](https://clickhouse.com/cloud/postgres) では、より広範な [pg_clickhouse](https://clickhouse.com/docs/products/managed-postgres/extensions/pg_clickhouse/)
パッケージの一部としても提供しています。既定の設定に `chdb_hook` を追加したい場合は、サポート担当者に
お問い合わせください。あるいは `psql` やお使いのクライアントでスーパーユーザーのアカウントに接続し、
`CREATE EXTENSION chdb;` または `LOAD 'chdb_hook';` を実行すれば、すぐに始められます。

---

## ClickHouse Managed Postgres を今すぐ始める

ClickHouse Managed Postgres が自社のデータでどう動くかを試してみませんか。ClickHouse Cloud なら数分で始められ、$300 分の無料クレジットを利用できます。

[サインアップ](https://console.clickhouse.cloud/signUp?intent=pg&loc=blog-cta-2035-clickhouse-managed-postgres&utm_blogctaid=2035)

---