---
title: "リアルタイム分析でDatabricksがClickHouse Cloudに及ばない理由"
date: "2026-10-07T02:34:22.561Z"
author: "Tom Schreiber and Lionel Palacin"
category: "Engineering"
excerpt: "ClickHouse CloudはCostBenchでDatabricksと比べ752倍優れたコストパフォーマンスを発揮しました。最新データの到着から高速な応答までの格差を検証します。"
---

# リアルタイム分析でDatabricksがClickHouse Cloudに及ばない理由

<style>
details.note-box {
  margin: 28px 0;
  background: #2B2B2B;
  color: #E2E8F0;
  border-left: 5px solid rgba(255,255,255,.1);
  border-radius: 12px;
}

details.note-box > summary {
  position: relative;
  padding: 18px 48px 18px 24px;
  cursor: pointer;
  list-style: none;
  font-size: 14px;
  font-weight: 600;
  line-height: 1.5;
  text-transform: uppercase;
  border-radius: 10px;
}

details.note-box > summary::-webkit-details-marker {
  display: none;
}

details.note-box > summary:hover {
  background: rgba(255,255,255,.05);
}

details.note-box > summary::after {
  content: "▶";
  position: absolute;
  right: 20px;
  color: #A0AEC0;
  font-size: 12px;
  transition: transform .2s;
}

details.note-box[open] > summary::after {
  transform: rotate(90deg);
}

details.note-box > .note-body {
  padding: 8px 24px 28px;
}

/* Comfortable line spacing */
details.note-box > .note-body > p,
details.note-box > .note-body li {
  font-size: 15px;
  line-height: 1.7;
}

/* Space between paragraphs */
details.note-box > .note-body > p {
  margin: 0 0 14px;
  padding: 0;
}

/* Larger breaks before main sections */
details.note-box > .note-body > p.note-heading {
  margin: 28px 0 8px;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: .025em;
  color: #E2E8F0;
}

/* Smaller breaks before subsections */
details.note-box > .note-body > p.note-subheading {
  margin: 22px 0 8px;
  line-height: 1.5;
  color: #E2E8F0;
}

details.note-box > .note-body > .note-heading:first-child {
  margin-top: 0;
}

/* Consistent list spacing */
details.note-box > .note-body > ul {
  margin: 0 0 16px;
  padding: 0 0 0 22px;
}

details.note-box > .note-body li {
  margin: 0;
  padding: 0;
}

details.note-box > .note-body li + li {
  margin-top: 8px;
}

details.note-box > .note-body > :last-child {
  margin-bottom: 0;
}
</style>

## 概要

リアルタイムシステムでは、到着したデータをクエリ可能な状態にするためのコストと効率に大きな違いがあります。
**本シリーズでは、データの到着から結果の取得までの道のりを追い**、それがデータの準備コスト、クエリコスト、クエリ実行時間にどのように影響するかを明らかにします。

本記事では、1,132億行の気配値データをストリーミングしながらクエリを実行し、ClickHouse CloudとDatabricksを比較します。集計データの反映に遅延が生じ得るテスト対象のDatabricks構成に対し、**ClickHouse Cloudはエンドツーエンドの1ドルあたりの性能で752倍優れていました**。

## 新鮮なデータから高速な回答へ

[リアルタイム分析](https://clickhouse.com/ja/blog/selecting-a-real-time-analytical-database-jp)では、新鮮なデータが届き続けても高速性を維持しなければなりません。**[CostBench](https://clickhouse.com/ja/blog/costbench-data-warehouse-cost-performance-jp) は、これを継続的な取り込み環境下で検証します。データセットが肥大化する最中にもクエリを実行するのです。** 効率的なデータ準備は、そのデータを[クエリ可能な状態](https://clickhouse.com/ja/blog/costbench-real-time-performance-per-dollar-jp)にするためのコストを引き下げ、クエリに残される作業量を削減して、クエリのコストと実行時間を削減します。

列指向ストレージにより、クエリは不要なフィールドをスキップできます。順序付けにより、ドリルダウンクエリは無関係な銘柄データをスキップできます。最新の事前集計により、対話型集計は準備済みのサマリーを結合できます。以下の図は、準備処理が追いついているか遅れているかに応じて、この[新鮮データパス](https://clickhouse.com/ja/blog/costbench-real-time-performance-per-dollar-jp)がクエリ側に残るスキャンと集計の作業量をどのように左右するかを示しています。

<iframe src="/uploads/01_fresh_data_path_query_work_balance_5a208c9817.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>

CostBench は、① 準備コスト、② クエリコスト、③ 実行時間を測定し、それらを 1 つの[エンドツーエンドのコストパフォーマンススコア](https://clickhouse.com/ja/blog/costbench-real-time-performance-per-dollar-jp)にまとめます。

本記事では、ClickHouse と Databricks の比較を通じて、取り込んだデータの準備からクエリの応答に至るこれら 3 つの効果を追っていきます。

今回の比較では、クエリ提供に Databricks Serverless SQL を使用しています。現在ベータ版である Databricks の新しいリアルタイムウェアハウス Lakehouse//RT は含まれていません。

## ワークロードと結果

> **この継続的な取り込みワークロードにおいて、ClickHouse Cloud は Databricks よりも 752 倍優れたエンドツーエンドのコストパフォーマンスを発揮しました。**

両システムともに、推奨される低レイテンシ取り込みパスとネイティブの準備機能を使用しました。ClickHouse は非同期挿入、Databricks は [Zerobus Ingest](https://docs.databricks.com/aws/en/ingestion/zerobus-overview#advantages)、リキッドクラスタリング、およびインクリメンタルマテリアライズドビューです。CostBench は、一致するソートキーまたはクラスタリングキーと、銘柄記号ごとの日次事前集計を使用して、**毎秒 100 万行**を目標に **1,132 億行の株式市場気配値データ**をストリーミングしました。**取り込み中、4 つの対話型集計クエリが 10 分ごとに、2 つのドリルダウンクエリが 1 時間ごとに実行されました。** クエリは、生テーブルまたは保持されたサマリーを通じて、増大する履歴データを対象としました。**読み取り側のコンピュートは 16 CPU で揃え**、クエリ結果のキャッシュは無効化しました。

CostBench は、以下の計算式を使用して**エンドツーエンドのコストパフォーマンススコア**を算出します。**スコア = (① 準備コスト + ② 正規化クエリコスト) × ③ 累積クエリ実行時間**

<iframe src="/uploads/02_costbench_end_to_end_score_ce47f605f4.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>

準備コストは、新鮮データパス全体をカバーします。正規化クエリコストは、記録されたクエリ実行時間に、適用される読み取り側コンピュート料金を掛けて算出します。累積クエリ実行時間は、クエリ所要時間の合計です。**スコアは低いほど優れています。**


<details class="note-box">
  <summary>① ② ③ はどのように測定したか (クリックして展開)</summary>
  <div class="note-body">
<iframe src="/uploads/02a_how_did_we_measure_0d6eefd769.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>
<iframe src="/uploads/02b_shared_costbench_harness_4f45aad9e9.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>
    <p class="note-heading"><strong>共通のテスト基盤</strong></p>
    <p>両システムとも、同じソースデータセット、スキーマ、ワークロード定義、ペーシングモデル、クエリスケジュール、結果フォーマットを使用しました。送信先固有のアダプターが配信とタイミングを処理しました。<a href="https://clickhouse.com/ja/blog/costbench-real-time-performance-per-dollar-jp">パート 1</a> で共通の手法を説明しており、<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/DATABRICKS_BENCHMARK_CONTRACT.md">Databricks ベンチマーク規約</a>に本プロバイダーの実装が記録されています。</p>
    <p class="note-heading"><strong>データセットと準備</strong></p>
    <p>完全な <a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes#dataset">NBBO データセット</a>には、113,219,565,734 行の幅の狭い 12 カラムのデータが含まれています。生テーブルには (sym, t) (銘柄記号とイベントタイムスタンプ) を使用し、日次サマリーには (sym, day) (銘柄記号と UTC 日) を使用しました。サマリーには、集計クエリで使用される件数、合計、価格の最小値と最大値が保持されました。</p>
    <p class="note-heading"><strong>継続的なワークロード</strong></p>
    <p>集計クエリとドリルダウンクエリが 10 分および 1 時間のスケジュールで実行される間、新鮮な行は毎秒 100 万行を目指してペース調整されました。これは、既存のデータセットをどれだけ迅速に一括ロードまたはバックフィルできるかを測定するのではなく、データが継続的に生成され、届いたそばから準備される様子をモデル化しています。Databricks の MV パスはネイティブのスナップショットセマンティクスを維持したため、取り込みの進行状況を揃えても、両システムのサマリーの新鮮さが同一になるわけではありません。</p>
    <p class="note-heading"><strong>推奨構成とサイジング</strong></p>
    <p>ClickHouse Cloud は 16 CPU、64 GiB の読み取りノードを使用しました。Databricks は 1 クラスターに固定された X-Small Serverless SQL ウェアハウス (約 16 ワーカー vCPU) を使用しました。このサイジングは同一のハードウェアやメモリを意味するものではありません。<a href="https://docs.databricks.com/aws/en/tables/clustering">Liquid クラスタリング</a>、<a href="https://docs.databricks.com/aws/en/optimizations/predictive-optimization">Predictive Optimization</a>、およびトリガー方式のインクリメンタル MV リフレッシュが有効化されました。テストワークスペースでは Lakehouse//RT が利用できなかったため、採用された比較では <a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/REAL_SERVERLESS_BASELINE.md">Serverless SQL ベースライン</a>を使用しています。</p>
    <p class="note-heading"><strong>① 準備コスト</strong></p>
    <p>完全な取り込みには、ClickHouse の完全な 2 ノード HA 取り込みサービスと、Databricks の Zerobus 取り込み、非同期クラスタリング、MV リフレッシュが含まれます。Databricks の取り込みとリフレッシュには割り当てられた DBU 使用量が使用され、クラスタリングには採用された Predictive Optimization DBU 割り当てが使用されます。3 つすべてが<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/costs/out/serverless_20260918/fresh_data_path.json">準備コストモデル</a>に記載されています。</p>
    <p class="note-heading"><strong>② クエリコストと ③ 実行時間</strong></p>
    <p>採用された各クエリの記録された所要時間は、読み取り側コンピュート料金で価格換算され、累積実行時間に加算されます。Databricks は結果取得を除いたクエリ履歴の合計所要時間を使用し、ClickHouse は記録されたランナー所要時間を使用します。これらの正規化コストは、採用されたクエリ作業を表しており、ウェアハウスの請求額全体ではありません。以下のクエリ比較と価格設定の注記に、タイミングと境界の詳細が記載されています。</p>
    <p class="note-heading"><strong>目標レートと実測レート</strong></p>
    <p>Databricks は、約 31.5 時間で永続的取り込みウィンドウを完了し、平均約 100 万行/秒を記録しました。ClickHouse は約 36.75 時間で取り込みを完了し、平均約 86 万行/秒を記録しました。目標は共通でしたが、観測された進捗は異なりました。Databricks の<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/results/serverless_baseline_full_20260918T170453Z/run_context.json">最終照合</a>により、重複する余剰分なしに 113,219,565,734 行すべてが確認されました。耐久性の確認とテーブルクエリの可視性は別のマイルストーンです。</p>
    <p class="note-heading"><strong>レポーティング対象期間</strong></p>
    <p>クエリごとのレイテンシグラフは 1,000 億行で終了します。準備コストはアクティブな取り込み全体を対象とし、累積クエリコストと実行時間は、各ワークロードの共通の比較終了地点までの採用されたアクティブ取り込み時の観測値を使用します。取り込み後のクエリとメンテナンスは、ヘッドラインスコアの対象外です。表示されている合計値は四捨五入されています。</p>
  </div>
</details>


ClickHouse Cloud は、測定された 3 つの要素すべてで優位に立ちました。



**① 準備コスト:** 28.69 ドル対 695.60 ドル<br/>
**② 正規化クエリコスト:** 約 0.05 ドル対 2.65 ドル<br/>
**③ 累積クエリ実行時間:** 56.39 秒対 29.10 分

以下のグラフは、取り込みの進行に伴うこれらのコストと実行時間の推移を示しています。

<iframe src="/uploads/03_accumulated_cost_and_runtime_d6c3816599.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>

以下のスコア内訳は、この 2 つの強みをまとめたものです。**準備コストと正規化クエリコストの合計が 24.3 分の 1** であり、これに**累積クエリ実行時間が 31 分の 1** であることが掛け合わされることで、ClickHouse Cloud に総合的なコストパフォーマンスの優位性をもたらしています。

<iframe src="/uploads/04_final_ranking_score_589730ff8a.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>

<details class="note-box">
  <summary>料金設定、計算式、および 752 倍のスコアについて (クリックして展開)</summary>
  <div class="note-body">
    <p class="note-heading"><strong>料金基準</strong></p>
    <p>ClickHouse Cloud は、コンピュートユニット (CU) あたり 1 時間 0.3903 ドルを使用します。Databricks は、AWS eu-west-1、Premium のリポジトリ登録済み公開定価を使用しています。割り当てられた取り込みとメンテナンスは 1 DBU あたり 0.39 ドル、Serverless SQL は 1 DBU あたり 0.91 ドルです。<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/results/serverless_baseline_full_20260918T170453Z/charts/full_path_cost_performance_clickhouse_vs_databricks_summary.json">採用されたサマリー</a>は完全な精度を保持しています。これらは定価に基づくモデルコストであり、過去の請求書の再構築ではありません。</p>
    <p class="note-heading"><strong>① 完全な準備コスト</strong></p>
    <p>これは、必要な準備コンポーネントを含む、全 113,219,565,734 行のアクティブな取り込みを対象としています。</p>
    <p class="note-heading"><strong>CLICKHOUSE CLOUD</strong></p>
    <p>両方の HA 取り込みノードを含めて、2 CU × 36.75 時間 × 0.3903 ドル/CU 時 = <strong>28.68705 ドル</strong>です。</p>
    <p class="note-heading"><strong>DATABRICKS の取り込み</strong></p>
    <p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/results/serverless_baseline_full_20260918T170453Z/ingest/zerobus_ingest_allocation.csv">割り当てられた Zerobus 使用量</a>は、1,098.9261167 DBU × 0.39 ドル = <strong>428.58119 ドル</strong>です。ソースのバイト量を料金のプロキシに変換するのではなく、この採用された DBU 割り当てをヘッドラインで使用しています。</p>
    <p class="note-heading"><strong>DATABRICKS のクラスタリング</strong></p>
    <p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/results/serverless_baseline_full_20260918T170453Z/ingest/predictive_optimization_allocation.csv">Predictive Optimization の割り当て</a>には、151.8613011 DBU × 0.39 ドル = <strong>59.22591 ドル</strong>が含まれます。このコンポーネントは、Predictive Optimization の操作レベルの DBU 割り当てを使用します。これは請求金額ではなく、モデル化されたメンテナンス費用です。</p>
    <p class="note-heading"><strong>DATABRICKS の MV リフレッシュ</strong></p>
    <p>532.8145064 割り当て DBU × 0.39 ドル = <strong>207.79766 ドル</strong>です。取り込み、クラスタリング、リフレッシュを合わせると、<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/costs/out/serverless_20260918/fresh_data_path.json">採用された準備モデル</a>では合計 <strong>695.60475 ドル</strong>になります。</p>
    <p class="note-heading"><strong>② 正規化クエリコスト</strong></p>
    <p>採用された各クエリの記録された所要時間に、秒あたりの読み取り側コンピュート料金を掛けます。これは採用された作業をモデル化したものであり、アイドル容量やウェアハウスの最低請求額は除外されています。</p>
    <p class="note-heading"><strong>CLICKHOUSE CLOUD</strong></p>
    <p>8 CU × 0.3903 ドル/CU 時 × (集計 10.312 秒 + ドリルダウン 46.074 秒) ÷ 3,600 = <strong>0.04890 ドル</strong>です。</p>
    <p class="note-heading"><strong>DATABRICKS SERVERLESS SQL</strong></p>
    <p>X-Small の料金は、6 DBU/時 × 0.91 ドル/DBU = <strong>5.46 ドル/時</strong>です。集計作業: 613.164 秒 × 5.46 ドル/時 ÷ 3,600 = <strong>0.92997 ドル</strong>です。</p>
    <p class="note-heading"><strong>DATABRICKS のドリルダウン作業</strong></p>
    <p>1,133.002 秒 × 5.46 ドル/時 ÷ 3,600 = <strong>1.71839 ドル</strong>です。正規化クエリコストの合計は <strong>2.64835 ドル</strong>です。</p>
    <p class="note-heading"><strong>割り当ての境界</strong></p>
    <p>Databricks の取り込みとメンテナンスは、2026-09-18 17:04:53 UTC から 2026-09-20 00:33:42.627 UTC までの<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/costs/scopes/serverless_20260918.json">プロデューサー稼働ウィンドウ</a> (終了時刻は含まず) に割り当てられます。取り込み後のメンテナンス、検証/制御 SQL、データベースストレージ、プロデューサーインフラストラクチャ、ネットワーク料金、およびアイドル時/最低ウェアハウス料金は除外されます。取り込み後にもメンテナンスが観察されましたが、その後の作業はこのスコアには請求されません。</p>
    <p class="note-heading"><strong>③ 累積クエリ実行時間</strong></p>
    <p>ClickHouse: 集計 10.312 秒 + ドリルダウン 46.074 秒 = <strong>56.386 秒</strong>。Databricks: 集計 613.164 秒 + ドリルダウン 1,133.002 秒 = <strong>1,746.166 秒</strong>。</p>
    <p class="note-heading"><strong>比較の境界</strong></p>
    <p>① はアクティブな取り込み全体をカバーします。② と ③ は、189 回の 4 クエリ集計バッチと 32 回の 2 クエリドリルダウンバッチを使用します。これらの行数比較対象期間は、1,000 億行のレイテンシプロットとは異なります。耐久性の整合は、クエリで可視な行や MV の新鮮さが同一であることを示すものではありません。これはモデル化された完全な準備パスと正規化クエリ作業であり、プロバイダーの請求額全体ではありません。</p>
    <p class="note-heading"><strong>最終スコア</strong></p>
    <p>ClickHouse: (28.68705 ドル + 0.04890 ドル) × 56.386 = <strong>1,620.30528</strong>。Databricks: (695.60475 ドル + 2.64835 ドル) × 1,746.166 = <strong>1,219,265.82646</strong>。<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/results/serverless_baseline_full_20260918T170453Z/charts/full_path_cost_performance_clickhouse_vs_databricks_summary.json">全精度の入力値</a>を使用した比率は <strong>752.491 倍</strong>となり、四捨五入して <strong>752 倍</strong>となります。</p>
  </div>
</details>

---

## リアルタイムのコストパフォーマンスが752倍

ClickHouseがお手元のデータでどのように機能するかご興味はおありですか？わずか数分でClickHouse Cloudを使い始めることができ、300ドル分の無料クレジットも進呈しています。

[サインアップ](https://console.clickhouse.cloud/signUp?loc=blog-cta-2540-752&utm_blogctaid=2540)

---

すべてのベンチマークコードと結果は [CostBench リポジトリ](https://github.com/ClickHouse/CostBench/tree/main/full-path-realtime/quotes)で公開されています。株式気配値データセットには[個別のデータライセンス](https://github.com/ClickHouse/CostBench/tree/main/full-path-realtime/quotes#data-source-and-licensing)が必要なため、データ自体の再配布はできません。

この結果を説明するために、データと同じ経路をたどります。まずデータの準備、次にクエリの処理を見ていきます。


## ClickHouse Cloud が受信データを準備する方法

このベンチマークでは、**高可用性を確保するために 2 CPU ノードを 2 台**備えた専用の ClickHouse Cloud 取り込みサービスを使用しました。これは、キャリブレーション中に目標を維持できた最小の HA 構成です。共有クライアントは、各ノードに組み込まれた[非同期挿入](https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse)を通じて行を送信しました。

下図は、これらの同一ノードが**合計 4 つの CPU コア**で、① 列指向ストレージ、② 生データの並べ替え、③ ソート済み事前集計に加え、バックグラウンドマージを処理する様子を示しています。

<iframe src="/uploads/05_clickhouse_fresh_data_path_fb0a4cca05.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>


**① 列への保存と ② データの並べ替え:** 取り込みノードが非同期挿入バッファをフラッシュすると、[MergeTree](https://clickhouse.com/docs/ja/reference/engines/table-engines/mergetree-family/mergetree) テーブルの (sym, t) キー(銘柄コードとイベントタイムスタンプ)によって生の気配値データをソートし、順序付けされた[データパート](https://clickhouse.com/docs/ja/concepts/core-concepts/parts)を書き込みます。

**③ データの並べ替えと事前集計:** 同じノードが、メモリ内の受信ブロックに対して[インクリメンタル MV](https://clickhouse.com/docs/ja/concepts/features/materialized-views/incremental-materialized-view) クエリを実行して集計状態を計算し、サマリーを含む順序付けされたパートを書き込む前に、[AggregatingMergeTree](https://clickhouse.com/docs/ja/reference/engines/table-engines/mergetree-family/aggregatingmergetree) テーブルの (sym, day) キーで結果をソートします。

[バックグラウンドマージ](https://clickhouse.com/docs/ja/concepts/core-concepts/merges)によって、両方のテーブルのパートが統合されます。

> 結果として、個別の更新サイクルを挟むことなく、同一のフラッシュされた挿入ブロックから生データと事前集計が[同時に進みます](https://clickhouse.com/docs/ja/resources/support-center/knowledge-base/materialized-views/are-materialized-views-inserted-asynchronously)。

<details class="note-box">
  <summary>4 コアの取り込みサービスはどれだけの作業を処理したか？(クリックして展開)</summary>
  <div class="note-body">
    <p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/clickhouse-cloud/results_t2">ClickHouse のライター使用率の結果</a>は、バックグラウンドのメンテナンスタスクと並行して取り込みが継続していることを示しています。CPU 使用率は利用可能な 4 コア中約 3.1 コアにとどまり、追跡されたメモリは許容量の範囲内に収まり、バックグラウンドマージは毎秒数百万行を処理し、パーティションあたりの最大アクティブパート数は約 100 を維持しました。これらの診断情報は、この比較で再利用された ClickHouse のソース実行のものです。</p>
    <p>高可用性を維持するために両方のノードが保持されたため、準備コストには完全な 2 ノード構成のデプロイが含まれています。</p>
  </div>
</details>

次に、取り込み、クラスタリング、MV のリフレッシュに別々のサービスを使用する Databricks で、同じ 3 つの準備タスクをたどってみましょう。


## Databricks が受信データを準備する方法

このベンチマークでは、Arrow Flight ストリーム経由で Delta テーブルに直接行をプッシュする Databricks のマネージドパスである [Zerobus Ingest](https://docs.databricks.com/aws/en/ingestion/zerobus-ingest) を使用しました。

下図に示すように、Zerobus が ① 列指向ストレージを処理し、非同期のサーバーレスクラスタリングが ② 生データの並べ替えを処理し、個別のサーバーレス MV パイプラインが ③ 事前集計を処理します。

<iframe src="/uploads/06_databricks_fresh_data_path_eb76667a8f.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>

**① 列への保存:** Zerobus は受信した行をバッファリングし、列指向の Parquet ファイルを基盤とするマネージド Delta テーブルに書き込みます。永続性の確認応答(Durability acknowledgment)は、Zerobus がデータを永続的に受け入れたことを確認するものですが、テーブル内ですぐに可視化されることを保証するものではありません。

**② データの並べ替え:** 生データテーブルは、ClickHouse のソートキーに合わせて (sym, t) の [liquid clustering](https://docs.databricks.com/aws/en/tables/clustering) を使用しました。[Predictive Optimization](https://docs.databricks.com/aws/en/optimizations/predictive-optimization) がサーバーレスコンピュート上で非同期にクラスタリングを実行するため、新たに書き込まれたファイルは、そのレイアウト処理が完了する前でもクエリできます。

**③ データの並べ替えと事前集計:** 独立した[サーバーレスパイプライン](https://docs.databricks.com/aws/en/ldp/dbsql/materialized)が、(sym, day) でクラスタリングされた日次サマリーを段階的にリフレッシュしました。[テストされた定義](https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/create_full_serverless_baseline_r3_20260918.sql)では、REFRESH POLICY INCREMENTAL STRICT と TRIGGER ON UPDATE AT MOST EVERY INTERVAL 1 MINUTE を使用しました。このトリガーは Databricks が[サポートする最小間隔である 1 分](https://docs.databricks.com/gcp/en/ldp/dbsql/schedule-refreshes#trigger-on-update)を使用しており、リフレッシュの開始を制限するもので、完了時間を制限するものではありません。



<details class="note-box">
  <summary>なぜこれらの取り込みパスなのか、どのようにバッファリングされたのか？(クリックして展開)</summary>
  <div class="note-body">
    <p class="note-heading"><strong>同一の取り込み課題</strong></p>
    <p>アプリケーションは頻繁な書き込みを発生させ、それを効率的なストレージへの書き込みに変換する必要があります。どちらの移行先も、マネージドバッファリングを備えた直接の「アプリケーションからテーブルへ」の取り込みを使用しました。測定対象のパスには、Kafka ブローカー、ファイルランディングステージ、Auto Loader ジョブなどは追加されていません。</p>
    <p class="note-heading"><strong>DATABRICKS のマネージドパス</strong></p>
    <p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/REAL_SERVERLESS_BASELINE.md">採用されたランナー</a>は、Zerobus Arrow Flight DoPut インターフェースを使用し、16 の同時実行ストリームと 50,000 行のクライアントバッチを使用しました。ストリームは 10 分ごとにローテーションされ、SDK のリカバリと有界リトライが有効化されました。Zerobus の取り込みコンピュートは、クラスタリング、MV のリフレッシュ、SQL サービスとは個別に割り当てられ、価格設定されました。</p>
    <p class="note-heading"><strong>CLICKHOUSE のネイティブパス</strong></p>
    <p>async_insert が有効化された通常の INSERT リクエストは、受信側の各ノードでバッファリングされました。<a href="https://clickhouse.com/docs/ja/concepts/features/operations/insert/asyncinserts">適応型フラッシュタイムアウト</a>が、受信トラフィックに応じて応答しました。並べ替えと事前集計は取り込みノード上で実行され、専用の<a href="https://clickhouse.com/docs/ja/products/cloud/features/infrastructure/warehouses">取り込みサービス</a>は、個別にサイジングされた読み取りサービスとストレージを共有しました。</p>
    <p class="note-heading"><strong>共通のペース調整</strong></p>
    <p>両方のアダプターは同一の Parquet データセットを読み取り、同一の目標レートモデルのもとで同一のスキーマをデコードしました。並列度とクライアントのバッチサイズは各移行先の API に適合させたものであり、強制的に同一にはしていません。</p>
    <p class="note-heading"><strong>CLICKHOUSE のバッチ</strong></p>
    <p>クライアントは非同期挿入を通じて 3,000 行のバッチを送信しました。デフォルトのバッファリングは、3 つのしきい値(100 MiB のバッファ蓄積、50 ミリ秒〜1 秒の間の適応型タイムアウト、または 450 件のキューイングされた挿入クエリ)のいずれかに最初に達した時点でフラッシュされました。</p>
    <p class="note-heading"><strong>DATABRICKS のバッチ</strong></p>
    <p>各 Arrow Flight ストリームは、IPC 圧縮を無効にして 50,000 行のバッチを送信しました。目標レートは論理ソース行に基づいており、確認応答された永続的な進捗状況は、テーブルでの可視性とは個別に記録されました。それらのバッチは、後からのバルクロードのためにファイルとしてステージングされたものではありません。</p>
    <p class="note-heading"><strong>バッチサイズの境界</strong></p>
    <p>これらはクライアントの配信バッチサイズです。両システムとも配信をストレージへの書き込みへとバッファリングするため、3,000 行や 50,000 行という数値は、最終的なパートや Parquet ファイルのサイズを指定するものではありません。</p>
    <p class="note-heading"><strong>リトライと整合性確認</strong></p>
    <p>Zerobus は永続的なストリームオフセットと SDK リカバリを使用しました。<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/results/serverless_baseline_full_20260918T170453Z/validation/validation_report_settled_20260921T092624Z.json">確定後の検証</a>により、正確な行の整合性が確認され、余分な重複がないことが確認されました。ClickHouse は、依存するマテリアライズドビューを含め、リトライに対する挿入の重複排除をサポートしています。最終的な行チェックは配信を検証するものであり、取り込み中のサマリーの鮮度が同等であることを検証するものではありません。</p>
    <p class="note-heading"><strong>インクリメンタルメンテナンス</strong></p>
    <p>生の Delta テーブルは、行の追跡、チェンジデータフィード、削除ベクターを有効にしました。MV はインクリメンタル処理の適格性チェックに合格し、INCREMENTAL STRICT を使用しました。<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/results/serverless_baseline_full_20260918T170453Z/evidence/mv_refresh_summary.json">リフレッシュのエビデンス</a>には、収集された実行全体(取り込み後の観察期間を含む)で、1,028 回のインクリメンタルなグループ集計リフレッシュが記録され、フルリフレッシュは 0 回でした。</p>
    <p class="note-heading"><strong>テストされた構成</strong></p>
    <p>サービング層は Serverless SQL X-Small でした。Lakehouse//RT はワークスペースで利用できなかったため、テストされませんでした。この記事では、利用できないサービング製品のパフォーマンスを予測するのではなく、採用された構成とその結果について説明します。</p>
  </div>
</details>

> 結果として、Databricks はクラスタリングが完了する前に生データを公開できますが、事前集計は独立したリフレッシュサイクルを経て進みます。

## これが鮮度と準備コストに意味すること


### 事前集計の遅延

ClickHouse は挿入中にサマリーを更新しますが、Databricks は非同期にリフレッシュします。下図は Databricks のリフレッシュ間隔を追跡したものです。**観察された完了リフレッシュの間隔は平均約 1.8 分で、プロットされたトレンドでは約 2.0 分に達しました**。

<iframe src="/uploads/07_pre_aggregation_lag_54dd069d49.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>


これらは、各サマリーが生テーブルからどれだけ遅れているかを正確に測定したものではなく、観察されたリフレッシュ完了の間隔です。リフレッシュとリフレッシュの間では、Databricks MV に対するクエリは古いサマリーを返す可能性があります。


<details class="note-box">
  <summary>事前集計の鮮度はどのように測定されたか？(クリックして展開)</summary>
  <div class="note-body">
    <p class="note-heading"><strong>DATABRICKS の系列</strong></p>
    <p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/results/serverless_baseline_full_20260918T170453Z/freshness/mv_freshness_20260918T170453Z.jsonl">鮮度の履歴</a>は 1 分ごとにポーリングされました。プロットされたメトリクスは、明確に観察された完了リフレッシュ ID 間の時間です(floor(現在の completed_at − 直前の観察された completed_at)、単位は秒)。選択されたアクティブ取り込みのエビデンスには、このような間隔が 1,021 個含まれています。高密度のポーリングでは、途中の完了を見落とす可能性があります。</p>
    <p class="note-heading"><strong>平滑化と読み取り値</strong></p>
    <p>中央揃えの 61 観測ローリング平均は、間隔の観測全体で平均約 1.8 分となります。さらに 11 観測の表示用平均と形状を保持する補間により、プロットされたピークは約 2.0 分になります。読み取り値はその表示された曲線に沿っています。これはリフレッシュ間隔のプロキシ(代替指標)であり、直接ポーリングされた生データと MV 間のウォーターマーク遅延や、クエリごとの古い行数ではありません。</p>
    <p class="note-heading"><strong>CLICKHOUSE のベースライン</strong></p>
    <p>ゼロのラインはベンチマークのセマンティクス上のベースラインであり、個別にポーリングされたプロバイダーのメトリクスではありません。生テーブルとインクリメンタル MV は、同一のフラッシュされた挿入ブロックを消費するため、それらの間に独立したサマリーリフレッシュ間隔はありません。これは、ソースからクエリまでの取り込み遅延がゼロであると主張するものではありません。</p>
  </div>
</details>

> ClickHouse は取り込み中もサマリーを最新の状態に維持しましたが、Databricks で観察されたリフレッシュは約 1.8 分間隔であり、クエリが古いサマリーを読み取る可能性が残りました。

その鮮度の違いは、クエリ実行時のデータにも引き継がれます。まず、次のグラフで各準備パスにかかったコストを検証します。


### 受信データをクエリ可能な状態に保つためのコスト

ClickHouse は、① 列指向ストレージ、② 生データの並べ替え、③ ソート済み事前集計を自社のエンジン内で処理します。Databricks はその処理を取り込み、サーバーレスクラスタリング、MV のリフレッシュに分散させます。以下のグラフは、累積された準備コストを比較したものです。

<iframe src="/uploads/08_fresh_data_path_cost_24599d3b47.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>


ClickHouse の取り込みサービス全体にかかったコストは **28.69 ドル**でした。Databricks のモデル化された準備コストは合計 **695.60 ドル**で、Zerobus の取り込み(①)に **428.58 ドル**、非同期クラスタリング(②)に **59.23 ドル**、MV のリフレッシュ(③)に **207.80 ドル**でした。取り込みとリフレッシュには割り当てられた DBU 使用量が使用されています。折りたたまれた価格設定の注記にその境界が記載されています。

> **ClickHouse は、このテストにおいて、列指向ストレージ、並べ替え、事前集計を 24.2 分の 1 の準備コストで処理しました。**

次に、生データとサマリーがどのようにクエリ処理されるかを見ていきます。


## ClickHouse Cloud がクエリを処理する方法

順序付けされた生データにより、ドリルダウンクエリは無関係な行をスキップできます。また、事前集計により、インタラクティブな集計クエリは個々の気配値から再計算する代わりに、準備された結果を結合できます。下図は、ClickHouse Cloud の読み取りサービス(Databricks の X-Small ワーカーの CPU 数と一致する、**16 CPU、64 GiB メモリの 1 ノード**)を通る両方のパスを示しています。


<iframe src="/uploads/09_clickhouse_query_serving_462877d424.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>

**ドリルダウン:** クエリは、[イベントレベルの MergeTree テーブル](https://clickhouse.com/docs/ja/reference/engines/table-engines/mergetree-family/mergetree)にある順序付けされた生データをプルーニングします。(sym, t) ソートキーの先頭カラムであるシンボルでフィルタリングすることで、読み取りサービスは無関係な気配値データをスキップできます。

**インタラクティブな集計:** クエリは [AggregatingMergeTree テーブル](https://clickhouse.com/docs/ja/reference/engines/table-engines/mergetree-family/aggregatingmergetree)から[最新の事前集計](https://clickhouse.com/docs/ja/concepts/features/materialized-views/incremental-materialized-view)を読み取り、はるかに小さな日次サマリー行のセットから、準備されたカウント、合計、最小値、最大値を結合します。待機すべき独立したリフレッシュはありません。

> 結果として、ドリルダウンは順序付けされた生データをプルーニングし、インタラクティブな集計は取り込み中に最新に保たれたサマリーを読み取ります。

Databricks も同じ 2 つのクエリパスを使用しますが、非同期の準備処理によってクエリが読み取れる内容が変わります。


## Databricks がクエリを処理する方法

下図は、[16 個のワーカー vCPU](https://docs.databricks.com/aws/en/compute/sql-warehouse/warehouse-behavior#sizing-and-cluster-provisioning) を備えた 1 クラスターに固定された **X-Small [Serverless SQL warehouse](https://docs.databricks.com/aws/en/compute/sql-warehouse/warehouse-types)** が、両方のワークロードを処理する様子を示しています。

<details class="note-box">
  <summary>なぜ LAKEHOUSE//RT は含まれなかったのか？(クリックして展開)</summary>
  <div class="note-body">
    <p>Lakehouse//RT は現在ベータ版です。アクセスをリクエストしていますが、まだ付与されていません。</p>
    <p>Lakehouse//RT が一般提供(GA)され、アクセスできるようになり次第、Lakehouse//RT でクエリを処理する完全な CostBench ワークロードを再度実行し、その結果を公開する予定です。</p>
  </div>
</details>

<iframe src="/uploads/10_databricks_query_serving_cf84562b72.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>

**ドリルダウン:** クエリは [Delta テーブル](https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/create_full_serverless_baseline_r3_20260918.sql)を直接読み取り、シンボルでフィルタリングします。(sym, t) に対する liquid clustering は、クラスタリングの実行後に無関係なファイルをスキップするのに役立ちますが、新たに公開されたファイルは、非同期メンテナンスが追いつくまでクラスタリングされないままになる可能性があります。

**インタラクティブな集計:** クエリは[インクリメンタル MV](https://docs.databricks.com/aws/en/ldp/dbsql/materialized)から日次サマリーを読み取ります。クエリが参照するのは最後に完了したリフレッシュスナップショットであり、新しい生の行はクエリ時に自動的に結合されません。したがって、結果には生テーブルにすでに到達しているデータが含まれない可能性があります。

**2 つのパスによって示される違い:** ドリルダウンはクラスタリングが未完了のデータをスキャンする可能性があり、インタラクティブな集計はリフレッシュが未完了のサマリーを読み取る可能性があります。どちらも、取り込みとは別個に進む準備処理に起因しています。

<details class="note-box">
  <summary>DATABRICKS のリフレッシュと可視性の保証は何を意味するのか？(クリックして展開)</summary>
  <div class="note-body">
    <p class="note-heading"><strong>スナップショットの契約</strong></p>
    <p><a href="https://docs.databricks.com/aws/en/ldp/dbsql/materialized#refresh-a-materialized-view">リフレッシュ</a>は、ソーステーブルから MV を更新します。測定された集計クエリは、そのマテリアライズされた結果を直接読み取りました。各クエリの前に同期リフレッシュを強制したり、生テーブルの差分を結果にマージしたりはしていません。したがって、測定されたレイテンシには、サマリーが古くなることを許容する Databricks のネイティブな仕様が含まれています。</p>
    <p class="note-heading"><strong>トリガーの契約</strong></p>
    <p><a href="https://docs.databricks.com/aws/en/sql/language-manual/sql-ref-syntax-ddl-create-materialized-view">TRIGGER ON UPDATE</a> は、アップストリームのデータが変更されたときにリフレッシュをスケジュールします。AT MOST EVERY INTERVAL 1 MINUTE はトリガー間の最小間隔を課すものであり、データの古さやリフレッシュ完了に対する 1 分の最大制限ではありません。</p>
    <p class="note-heading"><strong>インクリメンタルの契約</strong></p>
    <p>INCREMENTAL STRICT はメンテナンス方法を制御します。対象となる変更は、暗黙のうちにフル再構築にフォールバックすることなく、インクリメンタルに処理されます。これは、MV の可視性を取り込まれた各ブロックに結び付けたり、MV を継続的に最新に保ったりするものではありません。</p>
    <p class="note-heading"><strong>可視性の契約</strong></p>
    <p>ランナーの raw_rows は、確認応答された永続的な取り込みの進捗を記録します。Zerobus は、行が Delta テーブルに公開される前に、行を永続的に受け入れることができます。したがって、永続的な取り込みの進捗によって揃えられたクエリのペアは、両方のクエリがまったく同じ生の行数や、同様に新鮮なサマリースナップショットを見たことの証明にはなりません。</p>
    <p class="note-heading"><strong>比較の境界</strong></p>
    <p>ヘッドラインの結果は、その鮮度の挙動を含め、テストされた MV サービングパスをそのまま維持しています。リフレッシュを強制したり、生テーブルをクエリして再集計したりするような設計は、レイテンシとコストのプロファイルが異なってきます。その作業はこの結果には含まれていません。</p>
  </div>
</details>

> 結果として、Databricks のドリルダウンは新しく到着した未クラスタリングのデータをスキャンする可能性があり、インタラクティブな集計は以前のリフレッシュによるサマリーを読み取る可能性があります。


## これがクエリのパフォーマンスとコストに意味すること


### 順序付けされた生データに対するドリルダウン

両システムとも (sym, t) キーを使用しましたが、ClickHouse は挿入中に行を並べ替えたのに対し、Databricks はファイルを非同期にクラスタリングしました。[D1 と D2](https://clickhouse.com/ja/blog/costbench-real-time-performance-per-dollar-jp) は、1 つの銘柄の増加する履歴(1 時間ごとの価格サマリー、およびリスクと流動性のプロファイル)を直接クエリします。以下のグラフは、マテリアライズドビューをバイパスする、その生データパスをたどったものです。

<iframe src="/uploads/11_drill_down_query_latency_4a00019f1b.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>

ClickHouse Cloud は黄色、Databricks は赤色です。

<details class="note-box">
  <summary>クエリレイテンシと累積結果はどのように比較されたか？(クリックして展開)</summary>
  <div class="note-body">
    <p class="note-heading"><strong>クエリの定義</strong></p>
    <p><a href="https://clickhouse.com/ja/blog/costbench-real-time-performance-per-dollar-jp">パート 1</a> で A1〜A4 および D1〜D2 について説明しています。両システムとも同じ分析ワークロードとスケジュールを使用し、SQL は各エンジンに合わせて調整されました。カウント、合計、極値は厳密に比較されました。D2 の近似パーセンタイル部分には、<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/DATABRICKS_BENCHMARK_CONTRACT.md">契約の明示的な許容差</a>が使用されました。MV の鮮度は同一であるとは想定されていません。</p>
    <p class="note-heading"><strong>キャッシュポリシー</strong></p>
    <p>クエリ結果のキャッシングは無効にされました。Databricks のコンパクトなクエリエビデンスでは、採用されたクエリに対する結果キャッシュのヒットは報告されませんでした。基礎となるデータキャッシュは通常通りウォームアップすることが許可され、ベンチマークではクエリ間でキャッシュをフラッシュしませんでした。</p>
    <p class="note-heading"><strong>計測方法</strong></p>
    <p>Databricks のレイテンシは、結果の取得時間を除いた <a href="https://docs.databricks.com/aws/en/admin/system-tables/query-history">Query History</a> の total_duration_ms ÷ 1,000 を使用しています。ClickHouse は記録されたクエリ実行時間を使用します。これらの時間計測の慣例は、正規化されたクエリコストにも引き継がれます。中央値、P99、最大値の統計は、1,000 億行までの平滑化されていないクエリごとの観測値をプールしたもので、P99 には線形補間が使用されています。</p>
    <p class="note-heading"><strong>レイテンシのグラフ</strong></p>
    <p>各システムは、それぞれが観測した取り込みの進捗に合わせてプロットされています。集計の傾向線には中央揃えの 7 観測ローリング中央値を使用し、ドリルダウンには端のウィンドウを縮小させた 5 観測値を使用しています。外れ値は除去されていません。曲線は表示上の平滑化であり、統計と累積合計には記録された元の実行時間が使用されています。</p>
    <p class="note-heading"><strong>インタラクティブな読み取り値</strong></p>
    <p>プロットの下の値は、選択された行数における表示された傾向線に従っています。対数スケールによりミリ秒と秒を一緒に読みやすくしており、線形スケールは絶対的な差異を示します。各グラフには独自の再生コントロールと行位置コントロールがあります。</p>
    <p class="note-heading"><strong>採用された累積ワークロード</strong></p>
    <p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/databricks/results/serverless_baseline_full_20260918T170453Z/integration/manifest.json">採用されたデータセット</a>には、システムあたり 189 回の 4 クエリ集計バッチと 32 回の 2 クエリドリルダウンバッチが含まれており、<strong>756 + 64 = 820 回の実行</strong>となります。ClickHouse の観測値は、Databricks の永続性の進捗(集計では 1,128 億 4,900 万行まで、ドリルダウンでは 1,116 億 4,900 万行まで)に揃えられました。最初の完全データセット観測値と、その後の取り込み後のサンプルは除外されています。</p>
    <p class="note-heading"><strong>累積グラフ</strong></p>
    <p>クエリの実行時間は、対応する取り込み件数におけるステップ合計として加算され、将来の実行を前の位置に平滑化したり補間したりすることはありません。準備コストの線は、完全な取り込みの合計を行の進捗に応じて比例配分したものであり、時間ごとの従量課金コストの推移ではありません。スコアは取り込みの経過時間ではなく、クエリの実行時間を合計したものです。</p>
  </div>
</details>

**ClickHouse Cloud:**



* **中央値 722.5 ms** - Databricks より 22.1 倍高速
* **P99 1.15 秒** - 42.7 倍高速
* **最大 1.18 秒** - 48.2 倍高速

32 回の 2 クエリバッチ全体における累積実行時間は **46.07 秒**でした。順序付けされた生データパスのおかげで、テーブルが大きくなっても両方のドリルダウンが 1 秒前後またはそれ未満に維持されました。

**Databricks:**



* **中央値 15.99 秒**
* **P99 49.11 秒**
* **最大 56.90 秒**

同じ 32 回のバッチ全体における累積実行時間は **18.88 分**でした。曲線は、拡大する生テーブルの読み取りに大幅に多くの時間が費やされていることを示しています。非同期クラスタリングでは、新しいファイルがシンボルフィルター用に十分に整理されないままになる可能性があります。

> **ドリルダウンワークロード全体において、ClickHouse Cloud は全体として 24.6 倍高速でした。**


### 順序付けされた事前集計データに対するインタラクティブな集計

日次の事前集計により、[A1〜A4](https://clickhouse.com/ja/blog/costbench-real-time-performance-per-dollar-jp) は準備されたカウント、合計、価格の最小値と最大値を結合できます。A1〜A2 はシンボルでサマリーをフィルタリングし、A3〜A4 はすべてのシンボルにわたって読み取ります。ClickHouse は挿入中に維持されたサマリーを読み取り、Databricks は直近にリフレッシュされたスナップショットを読み取ります。以下のグラフは、取り込みが継続する中でのレイテンシを比較したものです。

<iframe src="/uploads/12_aggregate_query_latency_0c61a5cd9a.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>

**ClickHouse Cloud:**



* **中央値 13 ms** - Databricks より 60.2 倍高速
* **P99 42 ms** - 48.4 倍高速
* **最大 111 ms** - 47.7 倍高速

189 回の 4 クエリバッチ全体における累積実行時間は **10.31 秒**でした。

**Databricks:**



* **中央値 782 ms**
* **P99 2.02 秒**
* **最大 5.30 秒**

同じ 189 回のバッチ全体における累積実行時間は **10.22 分**でした。これらのクエリは、次のリフレッシュを待たずに MV スナップショットを読み取ります。ClickHouse は生データの挿入パスとともにサマリーを維持しながらも高速でした。一方、Databricks で測定された速度には同等の鮮度は伴っていませんでした。

> **インタラクティブな集計ワークロード全体において、ClickHouse Cloud は全体として 59.5 倍高速であり、サマリーは挿入中に維持されていました。**


### 累積クエリコストと実行時間

2 つのクエリパスの合計の仕方は異なります。Databricks の累積実行時間の大半はドリルダウンが占めています。以下のグラフは両方のワークロードを結合し、ベンチマークの読み取り側コストモデルを使用して記録された実行時間を価格換算したものです。

<iframe src="/uploads/13_query_runtime_and_cost_274ef23224.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>

ClickHouse Cloud のクエリ実行時間の累積は **56.39 秒**、Databricks は **29.10 分**でした。正規化されたクエリサービングコストは、それぞれ約 **0.05 ドル**と **2.65 ドル**でした。これらはクエリ処理にかかるコストであり、ウェアハウス全体の請求額ではありません。

> **クエリワークロード全体において、ClickHouse Cloud は全体として 31 倍高速で、正規化されたクエリコストは 54.2 分の 1 でした。**


## 導入事例: Gala

Gala による Databricks から ClickHouse Cloud への移行は、より低コストで高速な分析を実現することによる本番環境でのメリットを示しています。分析に利用できるデータが増え、セルフサービス分析がより多くのチームで利用できるようになりました。AWS 上で、チームはより多くのソースからの継続的な取り込みを追加し、ビジネスチームが自分たちでデータを探索できるように Metabase を導入しました。移行が完了するまでに、同社は Databricks を廃止しました。

新しいレイアウトを最初から正しく設定したことで、それまで最適化されていなかったテーブルに対するクエリは数分から **1 秒未満**になりました。分析に利用できるデータは移行中に **3 TB から 9 TB** に増加した一方で、初期コストは **30% 削減**されました。「データインフラについてあれこれ悩むことがなくなりました」と Gala のリードデータアナリストである Mike Rexford 氏は述べています。[Gala の移行事例を読む](https://clickhouse.com/ja/blog/gala-jp)。


## Databricks がリアルタイム分析で ClickHouse Cloud に太刀打ちできない理由

新鮮なデータが到着し続ける中、ClickHouse Cloud はテストされたパス全体でリードしました。



**① 準備コスト: 24.2 分の 1**(取り込み、並べ替え、事前集計)。<br/>
**② 正規化されたクエリコスト: 54.2 分の 1**(クエリ処理)。<br/>
**③ 累積クエリ実行時間: 31 分の 1**(両方のクエリワークロード全体)。

最後のグラフはこれらの結果をまとめたもので、新鮮なデータが到着する中での累積クエリ実行時間に対して、合算された準備コストと正規化されたクエリコストをプロットしています。

<iframe src="/uploads/14_end_to_end_cost_vs_accumulated_query_clickhouse_databricks_ad5693797e.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>



上に行くほどモデル化された総コストが低く、右に行くほど累積クエリ実行時間が短いことを示します。

> ClickHouse Cloud は、データを継続的に取り込んでクエリを処理し、挿入中にサマリーを最新に保ちながら、エンドツーエンドで 752 倍優れた 1 ドルあたりの性能を実現しました。

その違いはデータが到着した瞬間から始まります。ClickHouse は挿入パス上で順序付けされた生データと最新のサマリーを準備します。Databricks は個別のクラスタリングサービスとリフレッシュサービスを追加するため、クエリが未完了のレイアウト作業や古いサマリーに遭遇する可能性があります。このワークロードでは、それらのサービスの実行コストがより高くなり、さらに両方のクエリパスでより多くの時間がかかりました。

これが、Databricks がリアルタイム分析において ClickHouse Cloud に太刀打ちできない理由です。