---
title: "リアルタイム分析でBigQueryがClickHouse Cloudに及ばない理由"
date: "2026-10-09T03:25:48.621Z"
author: "Tom Schreiber and Lionel Palacin"
category: "Engineering"
excerpt: "CostBenchにおいて、ClickHouse CloudはBigQueryの438倍のコストパフォーマンスを達成しました。データの到着から高速な応答に至るまでの格差を検証します。"
---

# リアルタイム分析でBigQueryが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>

## 概要

リアルタイムシステムでは、受信データが到着してからクエリ可能な状態になるまでのコストや効率に大きな違いがあります。本シリーズでは、そのプロセスを追いながら、データの準備コスト、クエリコスト、およびクエリ実行時間にどのような影響を与えるかを検証します。

本記事では、クエリの実行と並行して、ClickHouse CloudとBigQueryに1,132億行の見積もりデータを実際に取り込みます。ClickHouse Cloudは、BigQueryのCapacity料金プランと比較して**438倍**、On-demand料金プランと比較して**512倍優れたエンドツーエンドのコストパフォーマンス(1ドルあたりの性能)**を達成しました。この比較を通じて、その差がどこから生じているのかを明らかにします。

## データの最新化から高速な応答まで

[リアルタイム分析](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)を維持するコストが下がり、クエリ側の処理負荷も軽くなるため、クエリのコストと実行時間を削減できます。

列指向ストレージのおかげで、クエリは不要なフィールドをスキップできます。データの並び順(ソート)を活用すれば、ドリルダウンクエリは関係のない気配値(quote)データを読み飛ばせます。常に最新に保たれる事前集計があれば、対話型集計クエリは作成済みのサマリーを組み合わせるだけで済みます。以下の図は、前処理が追いついている場合と遅れている場合で、[最新データパス](https://clickhouse.com/ja/blog/costbench-real-time-performance-per-dollar-jp)におけるクエリの処理負荷がどのように変化するかを示しています。


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

CostBench は ① 前処理コスト、② クエリコスト、③ 実行時間を測定し、それらを統合して単一の [エンドツーエンドのコストパフォーマンススコア](https://clickhouse.com/ja/blog/costbench-real-time-performance-per-dollar-jp) を算出します。

本記事では、ClickHouse と BigQuery の比較を通じて、受信データの準備からクエリ応答に至るまでのこれら 3 つの影響を追っていきます。


## ワークロードと結果

> **データ取り込みとクエリを同時に実行した環境において、ClickHouse Cloud は BigQuery に対し、Capacity 料金体系で 438 倍、On-demand 料金体系で 512 倍優れたエンドツーエンドのコストパフォーマンス(1ドルあたりの性能)を達成しました。**

両システムとも、推奨されるリアルタイム取り込みパスとネイティブの前処理機能を使用しました。ClickHouse は非同期挿入、BigQuery は Storage Write API のコミット済みストリーム、クラスタリング、および増分マテリアライズドビューです。CostBench は、**毎秒 100 万行**を目標として **1,132 億行の株式気配値データ**をストリーミングし、同等のソートキーまたはクラスタリングキー、および銘柄コード別のデイリー事前集計を適用しました。**取り込み中、4 種類の対話型集計クエリが 10 分ごとに実行され、生の気配値データに対する 2 種類のドリルダウンクエリが 1 時間ごとに実行されました。** 各クエリは、新しく到着した気配値データを含め、その時点までに取り込まれた全履歴を対象としました。クエリ結果のキャッシュは無効化されています。

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

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

前処理コストは、最新データパス全体をカバーします。正規化クエリコストはクエリが消費したリソースに価格を適用したものであり、累積クエリ実行時間は各クエリの所要時間の合計です。**スコアは低いほど優れています。** BigQuery の Capacity 料金と On-demand 料金は、測定された同一のワークロードに対する別の料金換算であり、クエリレイテンシは同じです。






<details class="note-box">
  <summary>① ② ③ はどのように測定されたか(クリックして展開)</summary>
  <div class="note-body">
<iframe src="/uploads/02a_how_did_we_measure_e9e2d7852a.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>
<iframe src="/uploads/02b_shared_costbench_harness_02f52cbc8c.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/bigquery/BIGQUERY_BENCHMARK_CONTRACT.md">BigQuery ベンチマーク規約</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) を使用し、デイリーサマリーは銘柄コードと UTC 日付の (sym, day) を使用しました。サマリーは、集計クエリで使用される件数、合計、価格の最小値・最大値を保持しました。</p>
    <p class="note-heading"><strong>継続的なワークロード</strong></p>
    <p>新規の行は毎秒 100 万行を目標にペース調整され、その間、集計クエリとドリルダウンクエリがそれぞれ 10 分間隔および 1 時間間隔のスケジュールで実行されました。これにより、継続的に生成され到着と同時に前処理されるデータがモデル化されます。BigQuery の <a href="https://docs.cloud.google.com/bigquery/docs/materialized-views-create#use_materialized_views_with_max_staleness_option">max_staleness オプション</a>は未設定のままにされたため、MV クエリはより新しいベーステーブルのデータを含める必要がありました。</p>
    <p class="note-heading"><strong>推奨構成とサイジング</strong></p>
    <p>ClickHouse Cloud は 16 CPU、64 GiB の読み取りノードを使用しました。BigQuery は動的にスロットが割り当てられ固定の予約を持たない <a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/bigquery/REAL_RUN.md">オンデマンドのサーバーレスクエリコンピュート</a>を使用しました。これは固定された 2 つの 16 CPU 割り当ての比較ではありません。Capacity の代替案は、同じ測定されたスロット消費量を Enterprise の定価で換算したものであり、独立した Capacity の実行を表すものではありません。</p>
    <p class="note-heading"><strong>① 前処理コスト</strong></p>
    <p>完全なパスには、ClickHouse の完全な 2 ノード HA 取り込みサービスと、BigQuery の Storage Write API による取り込みおよび自動 MV 更新が含まれます。BigQuery の自動再クラスタリングには <a href="https://docs.cloud.google.com/bigquery/docs/clustered-tables#clustered_table_pricing">個別の料金はかかりません</a>。Capacity と On-demand の前処理の合計は両方とも同じ取り込みメーターを保持し、それぞれのコンピュートモデルに基づいて更新リソースに価格を適用しています。</p>
    <p class="note-heading"><strong>② クエリコストと ③ 実行時間</strong></p>
    <p>ClickHouse のクエリコストは、記録された所要時間に読み取り側のコンピュート料金を掛けたものです。BigQuery Capacity はジョブのスロット秒数を使用し、On-demand は課金対象バイト数を使用します。両方の BigQuery 選択肢は、③ に対して同じ記録されたクエリ所要時間を使用します。これらの正規化されたコストは、プロバイダーの請求書全体ではなく、承認されたクエリ作業を表しています。</p>
    <p class="note-heading"><strong>目標レートと観測レート</strong></p>
    <p>BigQuery は論理データセット全体を約 <strong>31.5 時間</strong>で確認応答(ACK)し、平均 <strong>999,495 行/秒</strong>でした。ClickHouse は約 <strong>36.75 時間</strong>で取り込みを完了し、平均約 <strong>毎秒 86 万行</strong>でした。<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/bigquery/results/bq-full-t2-20260810_152224/ingest/ingest_summary.json">取り込みサマリー</a>には、BigQuery が確認応答した行がプロバイダーの書き込み成功メーターとは別に記録されています。そのメーターには 113,172,471,254 行の成功が記録されており、ClickHouse の書き込みコストのエビデンスには 113,217,743,918 行が含まれ、その差は 0.040% です。クエリの比較には、113,219,565,734 行の参照範囲を使用しています。</p>
    <p class="note-heading"><strong>レポート期間</strong></p>
    <p>クエリごとのレイテンシプロットは 1,000 億行で停止します。前処理コストは、完全な取り込みメーターと収集された更新使用量を保持します。累積クエリコストと実行時間は、参照エンドポイントまでの承認されたアクティブな取り込みの観測値を使用し、その後のクエリ観測値は除外されます。表示される合計は四捨五入されています。料金に関する注記には、更新エクスポートの境界と除外事項が記載されています。</p>
  </div>
</details>


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



① **前処理コスト:** $28.69(BigQuery は Capacity で $243.09 / On-demand で $264.59)<br/>
② **正規化クエリコスト:** 約 $0.05(BigQuery は Capacity で $4.75 / On-demand で $24.80)<br/>
③ **累積クエリ実行時間:** 58.29 秒(BigQuery はどちらの料金モデルでも 49.36 分)

以下のグラフは、データが到着する間にこれらのコストと実行時間がどのように累積したかを示しています。

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


次のグラフは、これらの要素にスコアの計算式を適用したものです。ClickHouse の**合計コストの低さ(Capacity 料金で 8.62 分の 1**、On-demand で **10.07 分の 1**)と、**累積クエリ実行時間の短さ(50.8 分の 1)**が組み合わさっています。

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


<details class="note-box">
  <summary>料金設定、計算式、および 438 倍 / 512 倍のスコア(クリックして展開)</summary>
  <div class="note-body">
    <p class="note-heading"><strong>料金の基準</strong></p>
    <p>ClickHouse Cloud は <strong>1 コンピュートユニット(CU)あたり 1 時間 $0.3903</strong> を使用します。BigQuery はチェックイン済みの <a href="https://cloud.google.com/bigquery/pricing">米国の定価</a> を使用します: Storage Write API 取り込みが <strong>$0.025/GiB</strong>、Enterprise Capacity が <strong>$0.06/スロット時間</strong>、On-demand 分析が <strong>$6.25/TiB</strong> です。<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/bigquery/results/bq-full-t2-20260810_152224/charts/full_path_cost_performance_clickhouse_vs_bigquery_wide_summary.json">承認されたサマリー</a>は完全な精度の入力を保持しています。Capacity と On-demand は、同一ジョブに対する代替のモデル化されたコストです。</p>
    <p class="note-heading"><strong>① 完全な前処理コスト</strong></p>
    <p>これには、ストリーミング取り込みメーター全体、追加料金なしの自動再クラスタリング、および収集された MV 更新の使用量が含まれます。</p>
    <p class="note-heading"><strong>CLICKHOUSE CLOUD</strong></p>
    <p>2 CU × 36.75 時間 × $0.3903/CU 時間 = <strong>$28.68705</strong>(両方の HA 取り込みノードを含む)。</p>
    <p class="note-heading"><strong>BIGQUERY の取り込み</strong></p>
    <p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/bigquery/costs/out/bq-full-t2-20260810_152224/ingest.json">Write API メーター</a>は、成功した入力バイト数を使用して <strong>9,642.7384687 GiB × $0.025/GiB = $241.06846172</strong> を記録しています。クライアントが確認応答した Arrow バイト数とプロバイダーが計測した入力バイト数は別の指標です。</p>
    <p class="note-heading"><strong>BIGQUERY のクラスタリング</strong></p>
    <p>自動再クラスタリングは個別の料金なしに含まれます。有料の手動再編成ジョブは追加されていません。</p>
    <p class="note-heading"><strong>BIGQUERY の MV 更新</strong></p>
    <p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/bigquery/costs/out/bq-full-t2-20260810_152224/mv_refresh.json">362 ジョブのエクスポート</a>には <strong>121,166.568 スロット秒</strong>が含まれており、$0.06/スロット時間で計算すると <strong>$2.0194428</strong>、または <strong>4,137,783,656,448 課金対象バイト数</strong>で、$6.25/TiB で計算すると <strong>$23.52057695</strong> となります。前処理の合計は、Capacity で <strong>$243.08790452</strong>、On-demand で <strong>$264.58903867</strong> です。</p>
    <p class="note-heading"><strong>② 正規化クエリコスト</strong></p>
    <p>BigQuery は、承認された同じクエリジョブに対し、消費されたスロット秒数または課金対象バイト数によって価格を算出します。ClickHouse は、記録された所要時間を読み取り側のレートで計算します。</p>
    <p class="note-heading"><strong>CLICKHOUSE CLOUD</strong></p>
    <p>四捨五入されたコストサマリーの入力値を使用すると、8 CU × $0.3903/CU 時間 × (10.324 秒の集計 + 47.962 秒のドリルダウン) ÷ 3,600 ≈ <strong>$0.05055</strong> となります。</p>
    <p class="note-heading"><strong>BIGQUERY CAPACITY</strong></p>
    <p>集計ジョブのコストは <strong>$4.29558297</strong>、ドリルダウンジョブのコストは <strong>$0.45264198</strong> で、合計 <strong>$4.74822495</strong> です。合計 <strong>79.1370825 スロット時間 × $0.06/スロット時間</strong>の割り当てには、記録されたジョブのスロット消費量が使用されます。</p>
    <p class="note-heading"><strong>BIGQUERY ON-DEMAND</strong></p>
    <p>集計ジョブのコストは <strong>$20.94800472</strong>、ドリルダウンジョブのコストは <strong>$3.85683775</strong> で、合計 <strong>$24.80484247</strong> です。合計の課金対象ボリュームは <strong>3.9687748 TiB × $6.25/TiB</strong> です。これは Capacity 料金に対する代替案であり、追加される要素ではありません。</p>
    <p class="note-heading"><strong>コストの境界</strong></p>
    <p>前処理モデルは、プロデューサー完了後の最終更新を含む、完全な書き込み成功メーターと収集された 362 件のすべての更新ジョブを保持します。クエリの合計からは、取り込み後のその後の観測値およびエビデンス収集ジョブが除外されます。データベースストレージ、無料枠、割引、アイドル時/最小容量料金、プロデューサーインフラストラクチャ、およびネットワーク料金は除外されます。</p>
    <p class="note-heading"><strong>③ 累積クエリ実行時間</strong></p>
    <p>ClickHouse: <strong>10.324 秒(集計)+ 47.962 秒(ドリルダウン)= 58.286 秒</strong>。BigQuery: どちらの料金モデルでも <strong>2,751.868 秒(集計)+ 209.518 秒(ドリルダウン)= 2,961.386 秒</strong>。</p>
    <p class="note-heading"><strong>比較の境界</strong></p>
    <p>① は完全な取り込みの前処理使用量を保持します。② と ③ は、参照範囲全体の行の進行状況に合わせて調整された、190 回の 4 クエリ集計バッチと 33 回の 2 クエリドリルダウンバッチを使用します。レイテンシの統計には、独立した 1,000 億行のウィンドウが使用されます。Capacity の代替案は、測定されたリソースに適用される価格を変更するだけであり、クエリハードウェアを変更したりワークロードを再実行したりするものではありません。</p>
    <p class="note-heading"><strong>最終スコア</strong></p>
    <p>ClickHouse: <strong>($28.68705 + $0.05055) × 58.286 = 1,674.99975</strong>。BigQuery Capacity: <strong>($243.08790452 + $4.74822495) × 2,961.386 = 733,938.44411</strong>(比率は <strong>438.172 倍</strong>)。BigQuery On-demand: <strong>($264.58903867 + $24.80484247) × 2,961.386 = 857,006.98809</strong>(比率は <strong>511.646 倍</strong>)。見出しの数値は四捨五入して <strong>438 倍および 512 倍</strong>としています。</p>
  </div>
</details>

---

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

ClickHouseが自社データでどのように機能するかご関心をお持ちですか？ClickHouse Cloudなら数分で利用開始でき、300ドル分の無料クレジットも提供しています。

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

---

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

この結果を説明するために、データと同じ経路、つまり準備処理からクエリ提供の順に追っていきます。


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

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

以下の図は、そのノードが**合計 4 つの CPU コア**で、バックグラウンドマージに加えて、① 列指向ストレージへの保存、② 生データの順序付け、③ 順序付けされた事前集約を処理する様子を示しています。

<iframe src="/uploads/05_clickhouse_fresh_data_path_ef0670f098.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 リフレッシュが個別に進む BigQuery における同じ 3 つの準備タスクを追ってみましょう。


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

このベンチマークでは、[BigQuery の Storage Write API](https://docs.cloud.google.com/bigquery/docs/write-api-grpc) をアプリケーション作成のコミット済みストリームとともに使用し、長期間維持される gRPC 接続経由で Arrow レコードバッチを送信しました。アペンドが成功すると、その行はクエリで利用可能になります。

以下に示すように、ストリーミングパスが ① 列指向ストレージへの保存を処理する一方で、BigQuery は ② クラスタリングと ③ インクリメンタル MV リフレッシュを非同期で管理します。

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

**① 列への保存:** Storage Write API は、[ネイティブの BigQuery テーブル](https://docs.cloud.google.com/bigquery/docs/tables-intro#standard-tables)に行を配信します。BigQuery は列指向ストレージをクエリコンピュートとは別に管理します。コミットされたアペンドの確認応答(ACK)は、テーブルのクラスタリングが完全に最適化されていることを保証するものではありません。

**② データの順序付け:** 生データテーブルは [CLUSTER BY sym, t](https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/bigquery/create.sql) を使用しており、シンボルフィルターによるストレージブロックのプルーニングを可能にしています。BigQuery は[自動再クラスタリング](https://docs.cloud.google.com/bigquery/docs/clustered-tables#automatic_reclustering)でそのレイアウトを維持しますが、アペンドされたすべてのバッチがすでに順序付けされていることは保証されません。

**③ データの順序付けと事前集約:** [ネイティブのインクリメンタル MV](https://docs.cloud.google.com/bigquery/docs/materialized-views-intro#types) は、気配値データを (sym, day) でグループ化し、同じクラスタリングキーを使用して件数、合計、価格の極値を維持しました。[サポートされる最小間隔](https://docs.cloud.google.com/bigquery/docs/materialized-views-manage#frequency_cap)である refresh_interval_minutes = 1 で自動リフレッシュが有効化されました。これにより、自動リフレッシュの頻度は最大で 1 分に 1 回に制限されます。要約が 1 分以内に最新になることを保証するものではありません。


> その結果、BigQuery ではクラスタリングが追いつく前に新しい行をクエリ可能にできますが、事前集約は別のリフレッシュサイクルを通じて進みます。

 <details class="note-box">
  <summary>なぜこれらの取り込みパスなのか、どのようにバッファリングされたか？(クリックして展開)</summary>
  <div class="note-body">
    <p class="note-heading"><strong>同じ取り込みの課題</strong></p>
    <p>頻繁なアプリケーションの書き込みを、効率的なストレージへの書き込みに変換する必要があります。ClickHouse は取り込みノード上で INSERT リクエストをバッファリングしました。BigQuery は、測定対象のパスに Kafka ブローカーやファイル着信ステージを介さず、コミット済みの Storage Write API ストリームを通じて Arrow バッチを受け入れました。</p>
    <p class="note-heading"><strong>BIGQUERY のストリーミングパス</strong></p>
    <p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/bigquery/REAL_RUN.md">フル実行構成</a>では、<strong>40 本のコミット済みストリーム</strong>、明示的な行オフセット、<strong>131,000 行のクライアントバッチ</strong>、および 16,000,000 バイトのリクエスト制限を使用しました。グローバルレートコントローラーがアペンド開始ペースを毎秒 100 万行に向けて調整しました。Parquet から読み取られた行数ではなく、正常な確認応答(ACK)が進捗を定義しました。</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 行のバッチを送信しました。デフォルトのバッファリングでは、バッファサイズ 100 MiB、50 ミリ秒から 1 秒の間の適応型タイムアウト、または 450 件のキュー内挿入クエリという 3 つのしきい値のうち、最初に達した時点でフラッシュされました。</p>
    <p class="note-heading"><strong>BIGQUERY のバッチ</strong></p>
    <p>各ワーカーは 1 本のコミット済みストリームを所有し、シリアライズされた Arrow レコードバッチを送信しました。これはリアルタイムのストリーミング配信であり、後のロードジョブのためにファイルとして行がアップロードされたわけではありません。保留中ストリーム(pending stream)のバッチコミットは使用されませんでした。</p>
    <p class="note-heading"><strong>バッチサイズの境界</strong></p>
    <p>ClickHouse の 3,000 行と BigQuery の 131,000 行というサイズはクライアント配信の単位です。これらは最終的な MergeTree パートや BigQuery のストレージブロックサイズを規定するものではありません。</p>
    <p class="note-heading"><strong>リトライと整合性確認</strong></p>
    <p>明示的なオフセットにより、BigQuery は確認応答の喪失後に正確なリプレイを検知できます。<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/bigquery/BIGQUERY_BENCHMARK_CONTRACT.md">クライアントの規約</a>では、確認済みのリプレイを 1 回だけカウントして再接続します。これにより、クラッシュからの再開が可能なソースチェックポイントではなく、ライブ実行内での exactly-once のリトライ処理が実現します。クライアントの確認応答、プロバイダーの書き込み成功行数、テーブルメタデータは、明確に区別されたエビデンスとして保持されます。</p>
    <p class="note-heading"><strong>インクリメンタルなメンテナンス</strong></p>
    <p>MV の定義には、アペンド専用ソースに対するサポート対象の COUNT、MIN、MAX、および SUM 操作を使用しました。<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/bigquery/costs/out/bq-full-t2-20260810_152224/mv_refresh.json">リフレッシュジョブのエクスポート</a>には、失敗したジョブはなく、<strong>362 回の成功した自動リフレッシュジョブ</strong>が含まれています。リフレッシュのスロット秒数と請求対象バイト数は、ダッシュボードジョブとは独立して記録されます。</p>
    <p class="note-heading"><strong>レイアウトとパーティショニング</strong></p>
    <p>D1 と D2 は時間述語なしで、取り込まれた履歴全体にわたってシンボルでフィルタリングするため、生データテーブルは意図的に非パーティション構成としました。(sym, t) のクラスタリングがそのワークロードに対応します。自動再クラスタリングはマネージド機能であり、個別のコンピュート料金はかかりません。手動の書き換えはベンチマークに追加されませんでした。</p>
  </div>
</details>


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


### 事前集約のラグ

ClickHouse は挿入中に要約を更新し、BigQuery は非同期で要約をリフレッシュします。以下のグラフは、**完全なリフレッシュサイクルごとの観測されたラグの最大値**を示しています。プロットされた BigQuery のサイクルピークは平均 **4.9 分**で、最大 **6.1 分**に達します。このセットアップでは、ClickHouse の生データと要約は一緒に進みます。

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

これは要約メンテナンスのラグを測定したものです。BigQuery でも、クエリ時により新しいベーステーブルの行を含めることで、最新の MV 結果を返すことができます。

<details class="note-box">
  <summary>事前集約のラグはどのように測定されたか？(クリックして展開)</summary>
  <div class="note-body">
    <p class="note-heading"><strong>BIGQUERY の時系列</strong></p>
    <p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/bigquery/results/bq-full-t2-20260810_152224/charts/mv_lag_clickhouse_vs_bigquery_wide_summary.json">鮮度モニター</a>は 1 分に 1 回 <a href="https://docs.cloud.google.com/bigquery/docs/information-schema-materialized-views#schema">refresh_watermark</a> をサンプリングしました。ラグは、そのウォーターマークから観測時までの経過時間です。最初の全行観測までに <strong>1,889 件のアクティブサンプル</strong>が含まれ、その後の <strong>441 件のサンプル</strong>は除外されています。これはメンテナンスのウォーターマークの尺度であり、結果の陳腐化(staleness)を示すものではありません。</p>
    <p class="note-heading"><strong>表示と読み取り値</strong></p>
    <p>グラフは、完全に観測された各リフレッシュウォーターマークサイクルから測定された最大値を 1 つ選択し、<strong>359 件のサイクルピーク</strong>を生成しています。最初と最後の部分的なサイクルは除外されています。その平均は <strong>4.861 分</strong>、最大値は <strong>6.100 分</strong>であり、それぞれ 4.9 と 6.1 に丸められています。アクティブな生の全時系列には <strong>8.023 分の起動時ピーク</strong>が存在しますが、このサイクルピーク表示からは除外されています。読み取り値は表示されている曲線に基づいています。</p>
    <p class="note-heading"><strong>CLICKHOUSE のベースライン</strong></p>
    <p>ゼロの基準線はベンチマークのセマンティクスに基づくベースラインであり、個別にポーリングされたプロバイダーのメトリクスではありません。生データテーブルとインクリメンタル MV はフラッシュされた同じ挿入ブロックを消費し、それらの間に独立した要約リフレッシュの間隔はありません。これは、ソースからクエリまでの取り込み遅延がゼロであることを主張するものではありません。</p>
  </div>
</details>

> ClickHouse は生データと並行して要約を維持しましたが、BigQuery のプロットされたリフレッシュサイクルのラグピークは平均 4.9 分であり、より新しい行をクエリ時に含める必要が生じました。

その新しい行がクエリの作業を増大させます。まず、準備パス自体のコストを比較してみましょう。


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

ClickHouse は、① 列指向ストレージへの保存、② 生データの順序付け、③ 順序付けされた事前集約を自社エンジン内で処理します。BigQuery は個別に課金されるストリーミング取り込みと MV メンテナンスを組み合わせており、自動再クラスタリングには追加料金がかかりません。以下のグラフは、BigQuery の両方の料金モデルにおける完全な準備コストを比較したものです。

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

ClickHouse の完全な取り込みサービスのコストは **$28.69** でした。BigQuery の Storage Write API のコストは **$241.07**(①)で、自動再クラスタリング(②)には個別の料金は発生しませんでした。MV リフレッシュ(③)は Capacity 料金で **$2.02**、オンデマンドで **$23.52** を追加し、準備コストの合計はそれぞれ **$243.09** と **$264.59** になりました。

> ClickHouse は、準備パス全体を **BigQuery Capacity より 8.5 分の 1**、**オンデマンドより 9.2 分の 1 のコスト**で処理しました。

次に、生データと要約がクエリ提供にどう送られるかを追ってみましょう。


## ClickHouse Cloud がクエリを提供する仕組み

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

<iframe src="/uploads/09_clickhouse_query_serving_3cdd0e160e.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)から最新の事前集約を読み取り、はるかに小さな日次要約行のセットから準備済みの件数、合計、最小値、最大値を結合します。待機すべき個別のリフレッシュはありません。

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

BigQuery も同じ 2 つのクエリパスをたどりますが、クラスタリングや要約リフレッシュが遅れると追加の作業が発生します。


## BigQuery がクエリを提供する仕組み

以下の図は、[BigQuery のサーバーレスコンピュートプール](https://docs.cloud.google.com/bigquery/docs/slots)を通る両方のワークロードを追ったものです。スロットは動的に割り当てられます。今回の実行では、固定の CPU 数を持つ専用ウェアハウスはありません。


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


**ドリルダウン:** クエリは[クラスター化された生テーブル](https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/bigquery/queries_raw.sql)を直接読み取ります。sym でのフィルタリングにより無関係なブロックをプルーニングできますが、新しく到着したデータは、再クラスタリングによってレイアウトが最適化される前にスキャンが必要になる場合があります。

**インタラクティブな集約:** クエリは[インクリメンタル MV](https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/bigquery/queries_mv.sql) を対象とし、その要約と、最後のリフレッシュ以降にベーステーブルに追加された変更を結合します。この[キャッチアップ作業](https://docs.cloud.google.com/bigquery/docs/materialized-views-use#incremental_updates)により、MV ウォーターマークが受信データより遅れている場合でも、結果を最新に保ちます。

したがって、どちらのパスも未完了の準備処理に遭遇する可能性があります。ドリルダウンではクラスタリングが不完全なデータをスキャンすることがあり、集約クエリではリフレッシュによってまだ要約されていない行を含める必要があります。

<details class="note-box">
  <summary>BIGQUERY の最新結果とコンピュートモデルはどのように機能するか？(クリックして展開)</summary>
  <div class="note-body">
    <p class="note-heading"><strong>最新結果の規約</strong></p>
    <p>max_staleness が設定されていない場合、マテリアライズドビューへの直接クエリには、MV にまだ反映されていないベーステーブルの変更が含まれます。リフレッシュウォーターマークの遅れは、返される回答が古いことを意味するわけではありません。準備作業の一部がクエリパスに残っていることを意味します。</p>
    <p class="note-heading"><strong>リフレッシュ規約</strong></p>
    <p>1 分のリフレッシュ間隔は頻度の上限(frequency cap)です。自動リフレッシュはベストエフォートであり、負荷がかかると完了頻度が下がることがあります。リフレッシュウォーターマークのラグとクエリレイテンシは個別に測定されます。このベンチマークでは、レイテンシの差のすべてをデルタ処理に帰するものではありません。</p>
    <p class="note-heading"><strong>コンピュート規約</strong></p>
    <p>測定されたジョブは、オンデマンドで動的に割り当てられたスロット上で実行されました。Enterprise Capacity 料金は、測定されたジョブのスロット秒数に対してスロット時間あたり $0.06 を適用します。固定の予約スロットでジョブを再実行したり、測定されたレイテンシを変更したりするものではありません。</p>
    <p class="note-heading"><strong>オンデマンド規約</strong></p>
    <p>もう一方の選択肢では、各ジョブの請求対象バイト数に対して TiB あたり $6.25 を適用します。バイト数とスロット秒数は、異なる料金体系における同一のジョブを表すものであり、それらのコストが合算されることは決してありません。</p>
    <p class="note-heading"><strong>可視性の境界</strong></p>
    <p>コミットされたアペンドが成功すると行がクエリ可能になりますが、テーブルメタデータは後で更新される場合があります。ランナーの進捗シグナルには確認済みの行が使用されます。クエリ可能性、メタデータの更新、クラスタリング、および要約リフレッシュは、明確に区別されたマイルストーンのままです。</p>
  </div>
</details>

> その結果、BigQuery のドリルダウンはクラスタリングが追いつく前に新しく到着したデータをスキャンする可能性があり、インタラクティブな集約には要約にまだ組み込まれていない新しい行が含まれます。


## これがクエリ性能とコストに意味すること


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

両システムとも (sym, t) キーを使用し、ClickHouse は挿入中に行を順序付けし、BigQuery は非同期でクラスタリングを管理しました。[D1 と D2](https://clickhouse.com/ja/blog/costbench-real-time-performance-per-dollar-jp) は、事前集約 MV をバイパスして、特定の銘柄の増加し続ける履歴(1 時間ごとの価格要約とリスク・流動性プロファイル)を直接調査します。以下のグラフは、この生データパスを追ったものです。

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

ClickHouse Cloud は黄色、BigQuery は青色です。

<details class="note-box">
  <summary>クエリレイテンシと累積結果はどのように比較されたか？(クリックして展開)</summary>
  <div class="note-body">
    <p class="note-heading"><strong>クエリの定義</strong></p>
    <p>パート 1 で A1〜A4 および D1〜D2 について説明しています。<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/bigquery/queries_raw.sql">BigQuery SQL</a> は、シンボルフィルター、全履歴の対象範囲、グループ化、順序付け、および LIMIT を維持しています。D2 は母中心モーメントとパーセンタイル用の APPROX_QUANTILES を使用しています。このパーセンタイルアルゴリズムは ClickHouse の quantilesTDigest と異なるため、許容範囲に基づいた比較が必要です。</p>
    <p class="note-heading"><strong>キャッシュポリシー</strong></p>
    <p>クエリ結果のキャッシュは、<a href="https://docs.cloud.google.com/bigquery/docs/cached-results#disabling_retrieval_of_cached_results">use_query_cache=False</a> で無効化されました。基礎となるデータキャッシュは正常に動作することが許可されており、クエリ間でフラッシュされることはありませんでした。</p>
    <p class="note-heading"><strong>タイミング</strong></p>
    <p>BigQuery のレイテンシは、完了したジョブの finalExecutionDurationMs を 1,000 で割った値です。ClickHouse は記録されたランナーの所要時間を使用します。中央値、P99、および最大値は、<strong>0 &lt; raw_rows ≤ 1,000 億</strong> の平滑化されていないクエリごとの観測値をプールします。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/bigquery/results/bq-full-t2-20260810_152224/charts/full_path_cost_performance_clickhouse_vs_bigquery_wide_summary.json">抽出データ</a>には、システムごとに <strong>190 回の 4 クエリ集約バッチ</strong>と <strong>33 回の 2 クエリドリルダウンバッチ</strong>が含まれており、<strong>760 + 66 = 826 回の実行</strong>となります。ClickHouse の観測値は、<strong>113,219,565,734 行の参照範囲</strong>を通じて BigQuery の行進捗と揃えられています。初期の観測値が存在する場合は維持され、取り込み完了後の遅い観測値は除外されています。</p>
    <p class="note-heading"><strong>累積グラフ</strong></p>
    <p>クエリ所要時間は、将来の実行を前の位置に平滑化または補間することなく、対応する取り込みカウントの位置でステップ合計として加算されます。準備コストの線は、取り込み全体の合計を行の進捗に応じて比例配分したものであり、時間ごとの課金コストを追跡したものではありません。スコアはクエリ所要時間を合算したものであり、取り込みの経過時間ではありません。</p>
  </div>
</details>

**ClickHouse Cloud:**



* **中央値 722.5 ms** - BigQuery より 4.47 倍高速
* **P99 1.15 秒** - 3.90 倍高速
* **最大 1.18 秒** - 4.05 倍高速

33 回の 2 クエリバッチ全体での累積実行時間は **47.96 秒**でした。両方のドリルダウンは、プロットされた期間の大部分で 1 秒前後またはそれ以下にとどまりました。

**BigQuery:**



* **中央値 3.232 秒**
* **P99 4.49 秒**
* **最大 4.78 秒**

同じ 33 バッチでの累積実行時間は **209.52 秒**でした。生テーブルが大きくなるにつれて、BigQuery の両方のドリルダウンは数秒台にとどまり続けました。

> ドリルダウンのワークロード全体で、ClickHouse Cloud は**全体で 4.37 倍高速**でした。


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

日次の事前集約により、[A1〜A4](https://clickhouse.com/ja/blog/costbench-real-time-performance-per-dollar-jp) は準備済みの件数、合計、価格の最小値と最大値を結合できます。A1〜A2 はシンボルで要約をフィルタリングし、A3〜A4 はすべてのシンボルにわたって読み取ります。ClickHouse は最新の要約を読み取りますが、BigQuery はより新しいベーステーブルの行も含める必要があります。以下のグラフは、取り込みが継続している間の集約レイテンシを示しています。

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

**ClickHouse Cloud:**



* **中央値 13 ms** - BigQuery より 270 倍高速
* **P99 42 ms** - 141 倍高速
* **最大 111 ms** - 62.5 倍高速

190 回の 4 クエリバッチ全体での累積実行時間は **10.32 秒**でした。

**BigQuery:**



* **中央値 3.508 秒**
* **P99 5.86 秒**
* **最大 6.93 秒**

同じ 190 バッチでの累積実行時間は **45.86 分**でした。ClickHouse がミリ秒単位で処理したのに対し、4 つの集約クエリはすべて秒単位にとどまりました。BigQuery の最新結果パスには、リフレッシュされた要約と並んで新しい行が含まれます。

> インタラクティブな集約ワークロード全体で、ClickHouse Cloud は挿入中に要約が維持されることで、**全体で 267 倍高速**でした。


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

インタラクティブな集約が、BigQuery の累積クエリ実行時間の大半を占めています。以下のグラフは両方のワークロードを組み合わせ、Capacity 料金およびオンデマンド料金におけるクエリコストを示しています。

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

ClickHouse Cloud の累積クエリ実行時間は **58.29 秒**、BigQuery は **49.36 分**でした。正規化されたクエリコストは、ClickHouse の約 **$0.05** に対し、BigQuery は **Capacity で $4.75**、**オンデマンドで $24.80** でした。

> ClickHouse Cloud はクエリワークロードを**全体で 50.8 倍高速**に処理し、正規化クエリコストは **BigQuery Capacity より 94 分の 1**、**オンデマンドより 491 分の 1** でした。


## 現場での事例: METRO Markets と Fountain

METRO Markets による ClickHouse Cloud の導入事例は、リアルタイム分析における高速なクエリとより予測しやすいコストという本番環境でのメリットを示しています。同チームは、本番クエリに対して BigQuery や Snowflake と並行してテストを実施した後に ClickHouse を選択しました。ClickHouse は大規模クエリと小規模クエリの双方でより高速に動作し、あるクエリは **4 秒から 200 ミリ秒未満**に改善しました。現在では、より予測しやすいコストを享受しながら、ほぼリアルタイムの出店者向けダッシュボードと全社的な分析を支えています。[METRO Markets のストーリーを読む](https://clickhouse.com/ja/blog/metro-markets-data-warehouse-jp)。

BigQuery を含むバッチ分析スタックから ClickHouse Cloud への移行を果たした Fountain の事例は、リアルタイムアプリケーションにおけるより新鮮なデータと高速なクエリの本番環境でのメリットを示しています。現在では ClickPipes と ClickHouse Cloud を使用して、現場採用プラットフォーム「Cue」を強化しています。データのリフレッシュ遅延は 3 時間から 2 分未満に短縮され、ほとんどのクエリが 1 秒未満で返るようになり、同社は**プラットフォームコストが約 66% 削減された**と報告しています。インクリメンタルマテリアライズドビューにより受信データが到着時に準備されるため、クエリ時に必要な作業が削減されます。[Fountain のストーリーを読む](https://clickhouse.com/ja/blog/fountain-agentic-ai-for-high-volume-hiring-jp)。

CostBench は、受信データの準備からクエリの提供に至るまで、分析パス全体にわたってその効率性を評価します。


## BigQuery はリアルタイム分析で ClickHouse Cloud に太刀打ちできない

新しいデータが到着し続ける中でも、ClickHouse Cloud は測定された 3 つのすべての要素でリードしました。



① 準備コスト: BigQuery Capacity より 8.5 分の 1 / オンデマンドより 9.2 分の 1。<br/>
② 正規化クエリコスト: Capacity より 94 分の 1 / オンデマンドより 491 分の 1。<br/>
③ 累積クエリ実行時間: どちらの BigQuery 料金モデルに対しても 50.8 分の 1。

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

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

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

> **ClickHouse Cloud は、データを継続的に取り込んで最新の結果を提供しながら、BigQuery Capacity と比較して 438 倍、オンデマンドと比較して 512 倍優れたエンドツーエンドのコストパフォーマンス(1 ドルあたりの性能)を実現しました。**

その差はクエリが到着する前から始まっています。ClickHouse は挿入中に生データを順序付けし、最新の要約を構築します。BigQuery はクラスタリングと MV リフレッシュがバックグラウンドで継続している間に新しい行をクエリ可能にします。そのため、集約クエリにはリフレッシュによってまだ要約されていない行を含める必要があります。

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