7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

前書き

先日 ClickHouse のイベントに参加してきました。これまで、Langfuse のバックエンドだったり、社内のデータ分析基盤だったり、自分にとっては近いところにある存在だったりするけど、ちゃんと触ってこなかったので、イベントに参加して実際に最新の ClickHouse のアーキテクチャに触れる貴重な機会を頂けて、とても満足してます:relaxed::point_up_tone1:

イベント中に、こんなものを作ってました。サンプル基地局データ約 4,300 万件を地球儀にプロットして、ズームすると密度が解像していく 3D グローブです。

65EF6A1C-07F6-4543-97F1-322E022698DF.jpeg

スタックはこんな感じ、フロントを AWS Amplify、集計エンジンを ClickHouse Cloud に任せています。

カテゴリ 技術
フロントエンド React 19 + Vite + TypeScript + Tailwind CSS 4
3D 描画 deck.gl 9(GlobeView)
バックエンド AWS Amplify Gen2(HTTP API Gateway + Lambda)
データストア ClickHouse Cloud(cell_towers 約 4,300 万行)

そして、このアプリのコードは 1 行も自分で書いてません......:sweat_smile: 後半で触れますが、ClickHouse の MCP / Skills と Claude Code に任せたら、黙々時間の片手間でここまで動いてしまいました。

この記事では、

  • ClickHouse って結局なにがすごいのか(基礎
  • 2026 年のいま、どうやって最速で入門するか(Cloud / サンプルデータ / MCP / Skills / Agents
  • 実際に「1 行も書かずに」グローブを作ったときの ClickHouse まわりの勘所

を、順に紹介していきます。

基礎紹介

ClickHouse とは

1_oU6Wv7f4UTtje3-TRK5HiA.png

ClickHouse は、列指向(カラムナ)の OLAP データベースです。ひとことで言うと「巨大なテーブルを、集計クエリでめちゃくちゃ速く舐めるための DB」です:point_up_tone1:

一般的な RDB(PostgreSQL や MySQL)は行指向で、1 レコードを丸ごと読み書きするのが得意です。一方 ClickHouse は 列ごとにデータを格納するので、count()avg() のような「特定のカラムだけを大量に集計する」処理で本領を発揮します。

ざっくり、速さの理由はこのあたりです。

仕組み 効いてくるところ
列指向ストレージ 集計に使うカラムだけを読むので I/O が激減
高い圧縮率 同じ型のデータが並ぶので圧縮が効く=読む量がさらに減る
ベクトル化実行 1 行ずつではなくブロック単位で CPU を回す
MergeTree エンジン ソート済みパーツ + スパースインデックスで範囲スキャンが速い

冒頭で「Langfuse のバックエンド」と書きましたが、まさに 大量のトレース/スパンを後から集計する という用途は ClickHouse の典型的な得意分野です。観測(observability)系のプロダクトが ClickHouse を採用しているのにはちゃんと理由があるんですね。

パフォーマンス比較

「速い速い」と言われても、どのくらい速いのか、公式のベンチマークを見るのが早いです。

ClickHouse は ClickBench をはじめ、PostgreSQL / Snowflake / Databricks / Redshift / Elasticsearch といった名だたる相手とのベンチを公開しています。

「2018 年比で 2.24 倍速くなった」「ある条件下では PostgreSQL の 1,000 倍速い UPDATE」みたいな主張が並びますが、個人的に好印象なのは すべて再現可能(reproducible)な形で公開している ところです。

数字だけ盛るのではなく「自分の環境で測ってね」というスタンス:relaxed:

FDEDBFD2-1EA6-4EB3-9833-B3B87DE9C8BD.jpeg

そして何より、今回 cell_towers で実際に測った数字が分かりやすかったです。

約 4,327 万行のフルスキャン集計が、だいたい 0.18 秒。
後述するグローブアプリでは、この速さを画面に出して「N 行を X ms でスキャン」と常時見せています。体感として「待たされない」という感覚が、ClickHouse の一番の説得力かもしれません。

今入門するには

「速いのは分かった、でも構築が大変なんでしょ:frowning2:?」と身構えるところですが、2026 年のいまは ClickHouse Cloud と AI ツール群のおかげで、入門のハードルがかなり下がっています。

ClickHouse Cloud で始める

セルフホスティングもできますが、一番手っ取り早いのは ClickHouse Cloud です。
自前でサーバーを立てる必要はありません。

  1. サインアップ(メール or Google / Microsoft / AWS Marketplace などの SSO)
  2. リージョンとサービス名を選ぶ(デフォルトの Scale tier は 3 レプリカ × 4 vCPU / 16 GiB、オートスケール付き)

これだけでセットアップは完了です。

356AE293-F143-46F5-8157-BFCDEF4080D6.jpeg

新規アカウントはクレカ登録不要で 無料トライアル(クレジット付き) が用意されています。
金額・期間は変わることがあるので、最新は料金ページで確認してください。トライアル中に今回の cell_towers くらいなら余裕で遊べます。

サンプルデータの使い方

自分のデータがなくても、すぐ試せるように サンプルデータのワンクリックインポート が用意されています。

ClickHouse Cloud のサービス画面で「Data sources → Predefined sample data → Cell Towers → Load data」を選ぶだけ。

OpenCelliD 由来のデータが、公開 S3 バケットから自動で投入されます。
今回のグローブアプリも、この cell_towers をそのまま使っています:point_up_tone1:

D433DBA7-BE85-42F3-8114-3C21BD0A72DC.jpeg

ちなみに中身はこんな分布で、5G(NR)はスナップショットの都合で極端に少ないです。

無線方式 件数
UMTS 約 2,069 万
LTE 約 1,210 万
GSM 約 993 万
CDMA 約 56 万
NR(5G) 867 件

もちろん、自分でデータを持っている場合は import も可能です。CSV / Parquet / S3 / Kafka など入口は色々ありますが、コツは公式も言うとおり 「1 行ずつではなく数万〜数百万行のバッチで入れる」 こと。

ここだけ守れば、入れる側で詰まることはほぼないです。

ClickHouse Agents の機能

さらに 2026/06/09 に、ClickHouse Agents が public beta で発表されました。

これは ノーコードの agentic 分析サービスで、LibreChat をベースに Claude(Sonnet / Haiku) で動いています。SQL が書けなくても、自然言語で質問すると SQL の生成 → 実行 → 可視化 まで会話の中でやってくれる、というものです。

主な機能はこのあたり。

機能 内容
ノーコード agent ビルダー instructions / skills / context を与えて自分用エージェントを定義
チャット分析 自然言語の質問から SQL と可視化を生成
サンドボックス code interpreter Python / Bash / JS を会話内で安全に実行
Skills / memories / artifacts ワークフローを部品化し、結果を共有可能な成果物に
マルチエージェント サブエージェントを束ねて複雑な分析を分担

ClickHouse Cloud ユーザーならすぐ試せます、しかもpublic beta期間中に利用料無料です!:relaxed:

ダッシュボードのメニューからClickHouse agnetsを選択し、遷移できます。
62EBEED1-4CC4-42D6-80B4-402C6967138C_4_5005_c.jpeg

あとは、AIエージェントのサポートのもとで、チャット形式でデータの可視化や分析ができるようになります。

E60335B0-F221-4DC6-A237-54DEE6387C54.jpeg

ちゃんと学びたい場合

手を動かして雰囲気を掴むのは上記で十分ですが、腰を据えて学ぶなら公式のテックブログがおすすめです。ベンチの裏側、MergeTree の内部、実運用のチューニングまで、一次情報がしっかり書かれています。

しかも日本語で!

料金

気になるお金の話。ClickHouse Cloud は使った分だけの従量課金で、料金は公式の Pricing calculator で構成ごとに試算できます。

E5AE5B09-16B5-4A82-B6E3-6311C02453D8.jpeg

個人的に効いたのが、アクセスがないアイドル状態だとコンピュートが自動で止まり、課金がデータ保存量(ストレージ)だけになるところです:relaxed:
クエリが来たら自動で立ち上がるので、今回みたいに「たまに触るデモ」だと、置いておくだけのコストがほとんど気になりません。

今回のような 個人の技術デモ規模 なら、無料トライアルのクレジットで十分まかなえます。本格運用するときは、リージョン・レプリカ数・コンピュート/ストレージのバランスを calculator でいじりながら感覚を掴むのがおすすめです:point_up_tone1:

自分で開発するなら — MCP / Skills をエージェントに繋ぐ

ここまでは「使う側」の話でした。ここからは、ClickHouse を使ったアプリを自分で開発するときの話です:point_up_tone1:

冒頭のグローブアプリも、自分で SQL やコードを書くのではなく、Claude Code に ClickHouse の MCP サーバーと公式 Skills を繋いで 作りました。
この 2 つを入れておくと、コーディングエージェントが 「スキーマ設計」「クエリ最適化」「トラブルシュート」を ClickHouse のベストプラクティス込みで面倒見てくれる ようになります。

① ClickHouse MCP サーバーを追加する

ClickHouse Cloud は リモート MCP サーバー を提供していて、ローカルにサーバーを立てたり接続情報をベタ書きしたりせず、OAuth でそのまま繋げるのがいちばん楽です:point_up_tone1:

まず Cloud 側で有効化します。サービス画面の左メニュー Connect → Connect with MCP を開き、トグルを ON にすると MCP 用の URL が出てきます。

https://mcp.clickhouse.cloud/mcp

あとは Claude Code に HTTP トランスポートで登録するだけ。接続情報(ユーザー名やパスワード)はどこにも書きません。

claude mcp add --transport http clickhouse-cloud https://mcp.clickhouse.cloud/mcp

登録したら Claude Code を起動して /mcp を実行し、clickhouse-cloud を選んで OAuth で認証 します。

/mcp

ブラウザで ClickHouse Cloud のログインを済ませれば接続完了です。

885ACCDA-1ABE-4F49-8E67-FE4692BC2B48_4_5005_c.jpeg

OAuth 方式なので、CLICKHOUSE_PASSWORD のような秘密情報を .mcp.json に書かなくて済むのが嬉しいポイント:relaxed: しかも run_select_querySELECT 限定(読み取り専用) なので、エージェントに繋いでも破壊的なクエリは走りません。スキーマや行数を見ながらクエリを書いてくれるので、設計の精度がぐっと上がります。

② 公式の Agent Skills を追加する

ベストプラクティス集である Skills は、これ一発で入ります。

npx -y skills add clickhouse/agent-skills --all

Skills を入れておくと、エージェントが「とりあえず動くけど ClickHouse 的には微妙」なクエリではなく、LowCardinalityMergeTreeORDER BY 設計まで踏まえた書き方 を最初から提案してくれます。ハルシネーションを抑える効果が大きいです。

黙々時間に作ったもの — 4,300 万点の基地局グローブ

では、この「MCP + Skills を繋いだエージェント」が実戦でどれだけ効くか。冒頭のグローブアプリを例に、ClickHouse まわりの勘所だけ抜き出して紹介します。

構成はシンプルで、ブラウザの deck.gl から Lambda 経由で ClickHouse Cloud に投げるだけです。

[Browser / deck.gl GlobeView]
        │  GET /api/towers?mode=agg&res=3&radios=LTE,UMTS&bbox=...
        ▼
[API Gateway (HTTP API) → Lambda (@clickhouse/client)]
        │  パラメータバインドした SQL
        ▼
[ClickHouse Cloud  default.cell_towers / cell_towers_h3]

勘所1: ズームに応じて H3 で事前集約する

4,300 万点をそのままブラウザに送ったら当然破綻します。そこで ズームレベルに応じて H3(六角形の地理インデックス)の解像度を変えて間引き ます。

ポイントは、ライブで geoToH3 集約すると数秒かかってしまうので、res 2〜6 をあらかじめ集約したテーブルを 1 枚用意しておく ことです。

clickhouse/setup.sql
CREATE TABLE IF NOT EXISTS default.cell_towers_h3
(
    h3_res     UInt8,
    radio      LowCardinality(String),
    h3         UInt64,
    cnt        UInt64,
    center_lon Float64,
    center_lat Float64
)
ENGINE = MergeTree
ORDER BY (h3_res, radio, h3);

-- res 2〜6 を投入(geoToH3 で六角形セルに丸める)
INSERT INTO default.cell_towers_h3
SELECT 3, radio, geoToH3(lon, lat, 3), count(), avg(lon), avg(lat)
FROM default.cell_towers
GROUP BY radio, geoToH3(lon, lat, 3);
-- ...res 2/4/5/6 も同様

radioLowCardinality(String) にしているのがミソです。無線方式は実質 5 種類(UMTS / LTE / GSM / CDMA / NR)しかないので、辞書エンコードでメモリもストレージもぐっと減ります。ORDER BY (h3_res, radio, h3) で、ズーム別 + 方式別の絞り込みがそのままインデックスに乗ります。

ズームと解像度の対応はこんな感じです。zoom 8 以上まで寄ったら、集約をやめて生の点(raw モード)を出します。

zoom モード H3 res
< 2 agg 2
2 〜 3.5 agg 3
3.5 〜 6.5 agg 4〜5
6.5 〜 8 agg 6
≥ 8 raw(生の点)

勘所2: クエリはパラメータバインドで組む

ビューポート(表示範囲の bbox)や radio フィルタはユーザー入力なので、文字列連結ではなく ClickHouse の query parameters で組み立てます。インジェクション対策にもなるし、型も効きます。

SELECT h3,
       toFloat64(sum(cnt)) AS cnt,
       sum(center_lon * cnt) / sum(cnt) AS lon,
       sum(center_lat * cnt) / sum(cnt) AS lat
FROM default.cell_towers_h3
WHERE h3_res = {res:UInt8}
  AND radio  IN {radios:Array(String)}
  AND center_lon BETWEEN {w:Float64} AND {e:Float64}
  AND center_lat BETWEEN {s:Float64} AND {n:Float64}
GROUP BY h3
ORDER BY sum(cnt) DESC
LIMIT {limit:UInt32}
SETTINGS max_execution_time = 10

地味にハマったのが、sum(cnt) をそのまま返すと JSON で数値ではなく文字列になってしまう点です。toFloat64(sum(cnt)) で明示的にキャストして、フロント側で数値として扱えるようにしています。大きな整数を JSON で渡すときの定番の罠ですね。

勘所3: 「速さ」を画面に出す

ClickHouse の HTTP レスポンス(JSON)には statistics.elapsedstatistics.rows_read が入っています。これを拾って画面右上に出すだけで、「⚡ N 行スキャン / X ms」 という、いちばん伝えたい体験がそのまま演出になります。

// ClickHouse レスポンスの statistics をそのまま表示用に変換
const elapsedMs = Math.round(json.statistics.elapsed * 1000)
const rowsRead  = json.statistics.rows_read

地球儀をぐりぐり回すたびに「4,300 万行を 0.18 秒」みたいな数字が更新されていくのは、デモとして地味に効きます:fist_tone1:

ちなみに pan / zoom のたびに毎回投げると往復が増えるので、300ms のデバウンスをかけています。ドラッグ中に 10 連射、みたいなことを防ぐ定番のやつです。

そして冒頭の「1 行も書いてない」の種明かしですが、ここまでの H3 集約テーブルの設計も、パラメータバインドのクエリも、toFloat64 の罠回避も、ぜんぶ ClickHouse Skills を入れた Claude Code が提案してくれた ものです。ベストプラクティスが手元のエージェントに最初から入っている、というのが今回いちばん体感した「楽さ」でした:relaxed::point_up_tone1:

最後に

ずっと「近くにあるのに、ちゃんと触ってこなかった」存在だった ClickHouse でしたが、いざ入門してみると、

  • 速さは想像以上(4,300 万行を 0.18 秒は気持ちいい)
  • 入門のハードルが下がっている(Cloud + サンプルデータのワンクリック)
  • MCP / Skills / Agents で、SQL もコードも AI に任せられる

気になった方は、まず無料トライアルでサンプルデータを入れて、ClickHouse Agents に「基地局を無線方式ごとに数えて」とでも話しかけてみてください。SQL を一文字も書かなくても、集計結果とグラフがすぐ返ってきて、たぶん「え、もう終わったの?」ってなります:point_up_tone1:

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?