---
title: "リアルタイム分析で Redshift Serverless が ClickHouse Cloud に及ばない理由"
date: "2026-10-14T15:12:28.250Z"
author: "Tom Schreiber and Lionel Palacin"
category: "Engineering"
excerpt: "CostBench において、ClickHouse Cloud は Redshift Serverless の 1,996 倍優れたコストパフォーマンスを達成しました。最新データの到着から高速な応答に至るまでの格差を検証します。"
---

# リアルタイム分析で Redshift Serverless が 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 と Redshift Serverless が 1,132 億件の気配値データを取り込みます。ドリルダウンに Redshift のライブストリーミングビューを使用した比較テストにおいて、ClickHouse Cloud は **1,996 倍優れたエンドツーエンドのコストパフォーマンス**を達成しました。その要因を明らかにするため、ストリーミングとデータ準備の一連のプロセスを検証します。

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

[リアルタイム分析](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_1bceb14b32.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 と Redshift Serverless の比較を通じ、受信データの準備からクエリの応答に至るこれら 3 つの影響を追っていきます。

## ワークロードと測定結果

> **この継続的な取り込み環境での比較において、ClickHouse Cloud は Redshift Serverless と比較して 1,996 倍優れたエンドツーエンドのコストパフォーマンスを達成しました。**

両システムとも、推奨されるリアルタイム取り込み経路とネイティブのデータ準備機能を使用しました。ClickHouse は非同期挿入、Redshift は Amazon MSK からのストリーミング取り込みと増分マテリアライズドビューです。CostBench は、**毎秒 100 万行**を目標レートとして **1,132 億行の株式市場気配値データ**をストリーミングし、同等のソートキーと銘柄記号別の日次事前集計を適用しました。**データ取り込みの間、10 分ごとに対話型集計クエリ 4 種類を実行し、1 時間ごとにドリルダウンクエリ 2 種類を実行しました。** Redshift の比較では、ドリルダウンにライブストリーミングビューを使用し、集計には最後に完了した日次 MV のリフレッシュを使用しています。クエリ結果のキャッシュは無効化しました。

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

<iframe src="/uploads/02_costbench_end_to_end_score_ef5edce174.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_caa5d13a7a.html" frameborder="0" style="width: 100%; height: 500px; max-height: 800px;"></iframe>
<iframe src="/uploads/02b_shared_costbench_harness_12ac582777.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/redshift-serverless/README.md">Redshift のアーキテクチャ</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 時間間隔のスケジュールで実行されました。これは、継続的に生成され、到着と同時に準備されるデータをモデル化しています。Redshift の集計クエリは最後に完了した日次 MV リフレッシュを読み取ります。取り込みの進捗を揃えても、そのスナップショットは ClickHouse の挿入時サマリーと同等の鮮度にはなりません。</p>
<p class="note-heading"><strong>推奨構成とサイジング:</strong></p>

<p>ClickHouse Cloud は 16 CPU、64 GiB の読み取りノードを使用しました。Redshift は、ライブデータ共有 (datashare) で接続された個別のライターおよびリーダーワークグループを使用しました。リーダーは <strong>32 RPU</strong> に固定しました。RPU はプロバイダーのキャパシティ単位であり、同一の CPU やメモリリソースを意味するものではありません。MSK は <strong>3 台の kafka.m7g.xlarge ブローカー</strong>、<strong>24 パーティション</strong>、レプリケーションファクター 3、ブローカーあたり 500 GB のストレージを使用しました。</p>
<p class="note-heading"><strong>① 準備コスト:</strong></p>

<p>このモデルには、ClickHouse の完全な 2 ノード HA 取り込みサービスと、Redshift のライターに加えて MSK ブローカーおよびストレージのコストが含まれます。採用された<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/redshift-serverless/costs/writer_capacity_assumption.json">ライターキャパシティシナリオ</a>では、プロデューサーの稼働時間全体にわたって <strong>32 アクティブ RPU</strong> を計上しています。当初の長時間実行テストでは 128 ライター RPU を使用しましたが、その後の特性評価により、32 RPU で目標を維持でき、16 RPU では維持できないことが判明しました。コストは 32 RPU でモデル化されており、記録されたレイテンシと鮮度は長時間実行テストの数値を維持しています。</p>
<p class="note-heading"><strong>② クエリコストと ③ 実行時間:</strong></p>

<p>ClickHouse は、記録されたクエリ実行時間を読み取り側のコンピュート料金に基づいて算出します。Redshift は、毎時間のリーダーの compute_seconds を、記録された経過時間の割合に応じて各ステートメントに配分し、その配分されたクエリコストを算出します。累積実行時間は、採用されたクエリ実行時間の合計です。この配分は、完全な請求書を再現するのではなく、クエリの処理負荷を表すためのものです。</p>
<p class="note-heading"><strong>目標レートと実際の測定レート:</strong></p>

<p>Redshift の<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/redshift-serverless/README.md">完了したテスト実行</a>では、全 <strong>113,219,565,734 行</strong>を <strong>113,227 秒</strong> (約 <strong>31.45 時間</strong>) で取り込み、平均 <strong>毎秒 999,933 行</strong>を記録しました。ClickHouse は約 <strong>36.75 時間</strong>で取り込みを完了し、平均して<strong>毎秒約 86 万行</strong>でした。目標値は共通でしたが、実際の進捗には差が生じました。なお、Kafka への配信、ストリーミングビューへの反映、子 MV への反映は、それぞれ独立したマイルストーンです。</p>
<p class="note-heading"><strong>レポート対象期間:</strong></p>

<p>クエリごとのレイテンシプロットは 1,000 億行の時点で終了しています。準備コストはプロデューサーの全稼働時間をカバーしており、累積クエリコストと実行時間は、参照エンドポイントを通じて得られたアクティブな取り込み時の有効な測定値を使用しています。その後のクエリ測定結果や鮮度サンプルは除外されています。また、ライターモデルには、後述する両方の子 MV リフレッシュ経路も含まれています。</p>
  </div>
</details>

測定された 3 つの要素すべてにおいて ClickHouse Cloud が優勢でした。

- ① **準備コスト:** $522.03 に対し $28.69
- ② **正規化クエリコスト:** $24.97 に対し約 $0.05
- ③ **累積クエリ実行時間:** 1.69 時間に対し 58.12 秒

以下のグラフは、データが到着し続ける中でのこれら差異の推移を示しています。

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

次のグラフはスコアの計算式を適用したものです。**準備コストと正規化クエリコストの合計が 19.0 分の 1** であり、これに**累積クエリ実行時間が 104.8 分の 1** であることが掛け合わされ、ClickHouse Cloud の包括的なリードにつながっています。

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

<details class="note-box">
  <summary>料金体系、計算式、および 1,996 倍のスコアについて (クリックして展開)</summary>
  <div class="note-body">
<p class="note-heading"><strong>料金の基準:</strong></p>

<p>ClickHouse Cloud は、<strong>コンピュートユニット (CU) あたり 1 時間あたり $0.3903</strong> を使用しています。Redshift はリポジトリに登録されている <a href="https://aws.amazon.com/redshift/pricing/"><strong>eu-west-2 の料金レート</strong></a> である <strong>$0.467/RPU-時</strong>を使用しています。<a href="https://aws.amazon.com/msk/pricing/">MSK</a> は <strong>1 ブローカー時間あたり $0.47175</strong>、ブローカーストレージは <strong>1 GB 月あたり $0.116</strong> を使用しています。<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/redshift-serverless/costs/out/t2/full_path_super.json">採用された完全経路サマリー</a>には、モデルと高精度の入力値が保持されています。</p>
<p class="note-heading"><strong>① 完全な準備コスト:</strong></p>

<p>フルパスシナリオには、113,227 秒のプロデューサー稼働時間全体にわたるライターコンピュート、MSK ブローカーの稼働時間、および日割り計算されたブローカーストレージが含まれます。ライターはストリーミング取り込み、バックグラウンドソート、および両方の子 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>Redshift ライター:</strong></p>

<p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/redshift-serverless/costs/writer_capacity_assumption.json">32 アクティブ RPU のシナリオ</a>では、<strong>32 × (113,227 ÷ 3,600) 時間 × $0.467/RPU-時 = $470.01785778</strong> となります。長時間のテスト実行では 128 ライター RPU を使用しましたが、32 RPU のコストシナリオは、その後の追従性評価に基づいており、最初の実行時の請求額そのものではありません。</p>

<p class="note-heading"><strong>MSK:</strong></p>

<p>3 ブローカー × プロデューサー稼働時間 × $0.47175/ブローカー時間 + 1,500 GB × $0.116/GB-月 × 稼働時間 ÷ 730 = 合計 <strong>$52.00912922</strong>。</p>
<p class="note-heading"><strong>共有準備経路:</strong></p>

<p>ライター + MSK = <strong>$522.02698699</strong>。このスコアでは、この総額が 1 回請求されます。2 つの読み取り選択肢の間で分割されたり、比較内で二重に計上されたりすることはありません。</p>
<p class="note-heading"><strong>② 正規化クエリコスト:</strong></p>

<p>ClickHouse は記録された実行時間に基づいて課金します。Redshift は、各時間のリーダーの <a href="https://docs.aws.amazon.com/redshift/latest/dg/SYS_SERVERLESS_USAGE.html#SYS_SERVERLESS_USAGE-table-columns">SYS_SERVERLESS_USAGE.compute_seconds</a> を、ステートメントの経過時間の割合に応じてその時間内に開始されたステートメントに配分し、採用されたクエリのシェアは $0.467/RPU-時で計算されます。</p>
<p class="note-heading"><strong>ClickHouse Cloud:</strong></p>

<p>丸められたコストサマリーの入力値を使用すると、8 CU × $0.3903/CU-時 × (集計 10.207 秒 + ドリルダウン 47.915 秒) ÷ 3,600 ≈ <strong>$0.05041</strong> となります。</p>
<p class="note-heading"><strong>Redshift 集計処理:</strong></p>

<p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/redshift-serverless/results/t2/billed_per_query_reader.csv">確定した時間ごとの配分</a>では、760 回の集計クエリ実行に対して <strong>$2.955693203</strong> が割り当てられます。これは、各クエリの実経過時間に一律の 32 RPU レートを乗算するのではなく、記録されたリーダーのコンピュート使用量とステートメントの実行時間を使用しています。</p>
<p class="note-heading"><strong>Redshift ドリルダウン処理:</strong></p>

<p>66 回の実行に対して <strong>$22.011782831</strong> が割り当てられ、正規化クエリコストの合計は <strong>$24.967476034</strong> となります。2 つのワークロードを合わせると、<strong>53.4635461 RPU-時</strong>の割り当てリーダーコンピュートとなります。</p>
<p class="note-heading"><strong>配分の境界:</strong></p>

<p>billed_times または billed_rpu_seconds と名付けられた履歴エビデンスフィールドには、1 時間あたりのコンピュート配分が保持されています。それらの名称は実際の請求書を証明するものではありません。データベースストレージ、クライアントの AZ 間転送、プロデューサー VM のコスト、割引、およびその後の取り込み完了後の測定値は、主要な集計スコープから除外されています。MSK のブローカーストレージは、準備コストのコンポーネントに含まれています。</p>
<p class="note-heading"><strong>③ 累積クエリ実行時間:</strong></p>

<p>ClickHouse: <strong>集計 10.207 秒 + ドリルダウン 47.915 秒 = 58.122 秒</strong>。Redshift: <strong>集計 722.871916 秒 + ドリルダウン 5,370.670031 秒 = 6,093.541947 秒</strong>。</p>
<p class="note-heading"><strong>比較の対象範囲:</strong></p>

<p>① では、プロデューサーの稼働時間全体と、設定された 32 RPU ライターモデルを使用します。② および ③ では、ストリーミングビューに対する 4 クエリの集計バッチ 190 回と、2 クエリのドリルダウンバッチ 33 回を使用します。ライターは型付きの子テーブルも維持しますが、型付きクエリの実行はこのスコアの対象外です。レイテンシの統計には、別途 1,000 億行の対象期間を使用しています。</p>
<p class="note-heading"><strong>最終スコア:</strong></p>

<p>ClickHouse: <strong>($28.68705 + $0.05041) × 58.122 = 1,670.27865</strong>。Redshift: <strong>($522.02698699 + $24.967476034) × 6,093.541947 = 3,333,133.70523</strong>。その比率は <strong>1,995.555 倍</strong>であり、四捨五入して <strong>1,996 倍</strong>となります。</p>
  </div>
</details>

---

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

ClickHouse を実際のデータで試してみませんか？ClickHouse Cloud は数分で利用開始でき、300 ドル分の無料クレジットも進呈されます。

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

---

すべてのベンチマークコードと結果は [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 が受信データを準備する方法

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

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

<iframe src="/uploads/05_clickhouse_fresh_data_path_fb6df76ab2.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>

次に、MSK ストリームからストリーミングビュー、そしてその日次サマリーに至るまで、Redshift Serverless での同一の準備タスクをたどります。

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

ベンチマークでは、S3 のランディングステージを挟まず、Amazon MSK からマテリアライズドビューへ直接取り込む [Redshift ストリーミング取り込み](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-streaming-ingestion.html)を使用しました。ビューは各クオートのペイロードを Redshift の [SUPER データ型](https://docs.aws.amazon.com/redshift/latest/dg/super-overview.html)で保存し、シンボルとイベントタイムスタンプは型付きソートキーカラムとして公開しました。グラフではこの読み取りパスを「SUPER」と表記しています。

下図は、①ストリーミングビューでの列指向ストレージ、②バックグラウンドソート、③日次集計 MV のインクリメンタルリフレッシュをたどっています。これは、クエリコンシューマーとは別に、準備コストの算出に使用された **32 RPU のライターシナリオ**を示しています。

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

**① カラムに保存:** プロデューサーが MSK にクオートを送信します。Redshift のライターはそのトピックを AUTO REFRESH YES で [quotes_streamed マテリアライズドビュー](https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/redshift-serverless/sql/setup_streaming.sql)に取り込みます。ライブストリーミングビューは、主要なドリルダウンクエリで使用されるイベントレベルのペイロードを保持します。

**② データを順序付け:** ストリーミングビューは SORTKEY (sym, t) を使用し、シンボルフィルターに対するスキャン並列性を維持するために DISTSTYLE EVEN を適用しました。Redshift は[バックグラウンドでソートする](https://docs.aws.amazon.com/redshift/latest/dg/t_Reclaiming_storage_space202.html#automatic-table-sort)ため、そのレイアウト処理が完了する前に新しく到着した行が可視化される可能性があります。

**③ データを順序付けして事前集約:** 個別の日次 MV が、ストリーミングビューから直接 (sym, day) でグループ化し、独自のソートキーを持ちます。コントローラーがインクリメンタルな [REFRESH MATERIALIZED VIEW ... RESTRICT](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-refresh-sql-command.html) を繰り返し発行します。日次 MV と型付き生プロジェクションは兄弟ブランチであり、日次サマリーは型付きブランチの完了を待ちません。

> 結果: Redshift のストリーミングビュー、バックグラウンドソート、日次サマリーは個別のステージを経て進むため、クエリが未完了の準備処理に遭遇する可能性があります。

<details class="note-box">
  <summary>なぜこれらの取り込みパスを採用し、どのようにバッファリングされたか？(クリックして展開)</summary>
  <div class="note-body">
<p class="note-heading"><strong>同一の取り込み課題:</strong></p>

<p>ソースは高頻度の書き込みを生成し、それを効率的な分析用ストレージへと変換する必要があります。ClickHouse はネイティブな非同期挿入を通じてこれらを受け入れます。Redshift の推奨される高レートストリーミングパスには、MSK ブローカークラスターとそれを取り込むライターワークグループが含まれ、どちらも準備コストに計上されます。</p>
<p class="note-heading"><strong>Redshift のストリーミングパス:</strong></p>

<p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/redshift-serverless/broker/produce_quotes.py">プロデューサー</a>は <strong>16 プロセス</strong>と lz4 圧縮を使用しました。MSK は 3 つのアベイラビリティゾーンにわたる 3 つのブローカー、24 パーティション、レプリケーション係数 3 を提供しました。Redshift はストリームを直接取り込み、中間の S3 ロードジョブは追加しませんでした。</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>Redshift の配信:</strong></p>

<p>プロデューサーのアクノリッジメントは Kafka への配信を報告するものであり、すべてのダウンストリームビューの完了を意味するものではありません。ストリーミング取り込みは生のストリーミングビューを更新し、個別のリフレッシュトランザクションが型付きプロジェクションと日次サマリーを更新します。</p>
<p class="note-heading"><strong>バッチサイズの境界:</strong></p>

<p>クライアントの INSERT バッチと Kafka バッチは転送単位です。これらは最終的な MergeTree パート、Redshift ストレージブロック、または日次 MV リフレッシュサイズを定義するものではありません。</p>
<p class="note-heading"><strong>進捗とリフレッシュのエビデンス:</strong></p>

<p>モニターは取り込み中に <a href="https://docs.aws.amazon.com/redshift/latest/dg/SYS_STREAM_SCAN_STATES.html">SYS_STREAM_SCAN_STATES</a> をサンプリングし、子リフレッシュをジャーナルに記録しました。これらの特定時点の観測結果はワークロードの実行中に記録されたものであり、実行後のビューから再構築されたものではありません。</p>
<p class="note-heading"><strong>インクリメンタルメンテナンス:</strong></p>

<p>2 つの子 MV は quotes_streamed 上に直接定義され、RESTRICT でリフレッシュされます。リフレッシュジャーナルのサーバーステータスがインクリメンタル更新であることを識別します。Manual や Auto といったラベルだけでは、インクリメンタルリフレッシュかフルリフレッシュかを判断できません。各子は独立してリフレッシュされます。</p>
<p class="note-heading"><strong>ライターキャパシティの境界:</strong></p>

<p>図の 32 RPU は、<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/redshift-serverless/costs/writer_capacity_assumption.json">採用されたキャパシティシナリオ</a>に基づいています。特性評価において、32 RPU は中央値約 5 秒のストリーミングラグで目標を維持できましたが、16 RPU では遅れが生じました。長期測定は 128 RPU のライターで記録されました。32 RPU で価格を算定したからといって、それらのレイテンシや鮮度の測定値が 32 RPU での再実行結果になるわけではありません。</p>
  </div>
</details>

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

### 事前集約のラグ

ClickHouse は挿入中にサマリーを構築しますが、Redshift はサマリーを個別にリフレッシュします。下図は、**Redshift の Kafka イベントウォーターマークから日次集計 MV まで**を追跡したものです。基礎となるアクティブな観測値では、**中央値で 46 秒のラグ**が示されています。ClickHouse のゼロラインは、生データとサマリーが足並みをそろえて更新されていることを表しています。

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

Redshift の系列にはストリーミング取り込みと日次リフレッシュのパスが含まれますが、ClickHouse のベースラインは生データからサマリーへの同期を表します。Redshift の日次 MV に対するクエリは最後に完了したリフレッシュを読み取るため、それより新しいストリーミング行が自動的に追加されることはありません。以下のクエリ提供の比較でも、この鮮度の動作が維持されています。

<details class="note-box">
  <summary>事前集約の鮮度はどのように測定されたか？(クリックして展開)</summary>
  <div class="note-body">
<p class="note-heading"><strong>Redshift 系列:</strong></p>

<p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/redshift-serverless/results/t2/charts/redshift_freshness_wide_summary.json">鮮度のエビデンス</a>には、アクティブなエンドポイントを介した成功した日次リフレッシュ記録を使用しています。これはリフレッシュ完了の間隔だけでなく、日次 MV に反映された Kafka イベントウォーターマークを測定します。ラグサンプラーが行の進捗タイムラインを提供します。</p>
<p class="note-heading"><strong>統計と表示:</strong></p>

<p>アクティブな日次 MV 系列には <strong>1,884 件の観測値</strong>が含まれ、ラグは<strong>中央値で 46 秒</strong>、<strong>P95 で 53 秒</strong>、<strong>最大で 79 秒</strong>でした。グラフには中央 5 件の観測値による移動中央値を適用しており、表示される曲線は約 <strong>64 秒</strong>に達します。最初の非単調なラグサンプルと、<strong>取り込み後の 463 件の日次リフレッシュ</strong>は除外されています。</p>
<p class="note-heading"><strong>ClickHouse のベースライン:</strong></p>

<p>ゼロラインはベンチマークのセマンティクスに基づく生データからサマリーへのベースラインであり、個別にポーリングされたソースからクエリへのメトリクスではありません。生テーブルとインクリメンタル MV は、フラッシュされた同一の挿入ブロックを消費します。これは取り込み遅延がゼロであると主張するものではなく、Redshift 系列と同じソースウォーターマークの境界を使用するものでもありません。</p>
  </div>
</details>

> ClickHouse は生データとサマリーを同期させ続けましたが、Redshift の日次サマリーは Kafka イベントウォーターマークから**中央値で 46 秒**遅れました。

鮮度は準備パスがもたらす結果の 1 つです。次のグラフでは、そのパスを実行するためのコストを算出します。

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

ClickHouse は、取り込みサービス内で ①列指向ストレージ、②生データの順序付け、③順序付けされた事前集約を処理します。Redshift はその作業を、別途料金が発生する MSK クラスターから供給されるライター内で処理します。下図は、ClickHouse の準備コストと、**32 RPU の Redshift ライターシナリオに MSK を加えたもの**を比較しています。

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

ClickHouse の完全な取り込みサービスにかかったコストは **28.69 ドル**でした。Redshift のモデル化された準備パスは合計 **522.03 ドル**で、ストリーミング取り込み、ソート、両方の子 MV リフレッシュパスを含むライターに **470.02 ドル**、MSK ブローカーとストレージに **52.01 ドル**でした。共有パスの費用は 1 回だけ請求されます。

> ClickHouse は、Redshift のライターと MSK を合わせたシナリオよりも **18.2 分の 1 のコスト**で完全な準備パスを処理しました。

次に、生データとサマリーがクエリ提供にどのように活用されるかをたどります。

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

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

<iframe src="/uploads/09_clickhouse_query_serving_58c9367ec0.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)から最新の事前集約を読み取り、はるかに小さな日次サマリー行のセットから、準備済みのカウント、合計、最小値、最大値を結合します。待つべき独立したリフレッシュ処理はありません。

> 結果: ドリルダウンは順序付けされた生データをプルーニングし、対話的な集約は取り込み中に最新の状態に保たれたサマリーを読み取ります。

Redshift では提供処理をコンシューマーワークグループに分離し、ライブデータ共有を介してストリーミングビューと集計ビューを読み取ります。

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

下図は、独立した **32 RPU のコンシューマーワークグループ**がライターから共有データを読み取る様子を示しています。[ライブデータ共有](https://docs.aws.amazon.com/redshift/latest/dg/datashare-overview.html)により、ストリーミングビューと日次集計 MV を 2 つ目のクエリ用データベースにコピーすることなく公開できます。

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

**ドリルダウン:** [ドリルダウンクエリ](https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/redshift-serverless/sql/queries_drilldown_super.sql)は quotes_streamed 内の型付き sym カラムをフィルタリングし、ペイロードからメジャーフィールドをナビゲートおよびキャストします。(sym, t) ソートキーはプルーニングをサポートしますが、バックグラウンドソートが完了する前に新しく到着した行が読み取られる可能性があります。

**対話的な集約:** クエリは、最後に完了したリフレッシュ時点の[日次集計 MV](https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/redshift-serverless/sql/queries_dashboard.sql) を読み取ります。クエリ実行時に、より新しいストリーミングビューの行を結果にマージすることはないため、返されるサマリーは受信データよりも遅れる可能性があります。

図の 2 つのパスは、準備処理が読み取り側に影響を与える箇所を示しています。ドリルダウンは未ソートのデータに遭遇する可能性があり、集約クエリは古いサマリーのスナップショットを読み取る可能性があります。

<details class="note-box">
  <summary>Redshift のリフレッシュとデータ共有の保証は何を意味するか？(クリックして展開)</summary>
  <div class="note-body">
<p class="note-heading"><strong>スナップショットの規約:</strong></p>

<p>クエリは日次 MV のコミットされたコンテンツを読み取ります。ベンチマークでは、クエリのたびに強制的にリフレッシュを行ったり、より新しいストリーミング行から結果を再構築したりはしませんでした。したがって、測定された集約レイテンシには、Redshift のサマリーリフレッシュのラグが含まれます。</p>
<p class="note-heading"><strong>リフレッシュの規約:</strong></p>

<p>AUTO REFRESH YES がストリーミング取り込みを駆動します。Redshift は別の MV 上に定義された MV に対する<a href="https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-create-sql-command.html#mv_CREATE_MATERIALIZED_VIEW-limitations">自動リフレッシュ</a>を許可しないため、コントローラーがダウンストリームの MV を個別にリフレッシュします。RESTRICT は、コミットされた親の状態から指定された子のみを更新します。これにより、型付きプロジェクションのリフレッシュ遅延が日次サマリーの鮮度に累積するのを防ぎます。</p>
<p class="note-heading"><strong>ライブ共有の規約:</strong></p>

<p>共有によって、ライターのコミットされたオブジェクトがリーダーワークグループに公開されます。これにより読み取りコンピュートと準備コンピュートが分離されますが、オブジェクトがより最新になるわけではなく、クエリがアクセスする前に最新の行がソートされるわけでもありません。</p>
<p class="note-heading"><strong>読み取りパスの境界:</strong></p>

<p>主要なドリルダウン結果はライブストリーミングビューから取得したものです。代替手段として型付きプロジェクションも維持され、測定されました。そのクエリ実行はこの記事のスコアからは除外されていますが、そのリフレッシュとストレージレイアウト処理は共有の準備シナリオに残されています。</p>
<p class="note-heading"><strong>サイジングの境界:</strong></p>

<p>リーダーは長期実行中、base=max 32 RPU に固定されました。ライターのキャパシティは準備コストのために個別にモデル化されています。スコアは、これらの宣言されたコスト前提と記録された読み取りパスの結果を組み合わせたものであり、プロバイダーの文字通りの請求書として提示しているわけではありません。</p>
  </div>
</details>

> 結果: Redshift のドリルダウンはバックグラウンドソートが完了する前の行を読み取る可能性があり、対話的な集約は以前のリフレッシュのサマリーを返す可能性があります。

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

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

ClickHouse は ORDER BY (sym, t) を使用し、挿入中に行を順序付けました。Redshift は SORTKEY (sym, t) を使用し、バックグラウンドソートに依存しました。[D1 と D2](https://clickhouse.com/ja/blog/costbench-real-time-performance-per-dollar-jp) は、1 つの銘柄の増加し続ける履歴を調査するもので、1 時間ごとの価格サマリー、およびリスクと流動性のプロファイルです。グラフは日次集計 MV をバイパスし、Redshift のライブストリーミングビューを追跡しています。

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

ClickHouse Cloud は黄色、Redshift Serverless はオレンジ色です。

<details class="note-box">
  <summary>クエリレイテンシと累積結果はどのように比較されたか？(クリックして展開)</summary>
  <div class="note-body">
<p class="note-heading"><strong>クエリの定義:</strong></p>

<p>パート 1 では A1〜A4 と D1〜D2 について説明しています。Redshift の SQL は、エンジン固有の置換を行いつつ、シンボルフィルターと全履歴のスコープを維持しています。D1 は最初と最後の価格を取得するためにウィンドウ関数を使用し、D2 は近似離散パーセンタイルとモーメント計算を使用します。超過尖度の規約が ClickHouse の生の母集団尖度とは異なるため、そのフィールドに関する厳密な数値的等価性は主張していません。</p>
<p class="note-heading"><strong>キャッシュポリシー:</strong></p>

<p><a href="https://docs.aws.amazon.com/redshift/latest/dg/r_enable_result_cache_for_session.html">enable_result_cache_for_session</a> はオフでした。基盤となるデータキャッシュは通常通り動作することが許可され、ベンチマークではクエリ間でそれらをフラッシュしませんでした。</p>
<p class="note-heading"><strong>タイミング:</strong></p>

<p>Redshift のレイテンシには秒単位に変換した <a href="https://docs.aws.amazon.com/redshift/latest/dg/SYS_QUERY_HISTORY.html#SYS_QUERY_HISTORY-table-columns">SYS_QUERY_HISTORY.elapsed_time</a> を使用し、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/redshift-serverless/results/t2/charts/full_path_cost_performance_clickhouse_vs_redshift_super_wide_summary.json">抽出されたデータ</a>には、システムごとに <strong>190 回の 4 クエリ集計バッチ</strong>と、<strong>ストリーミングビューに対する 33 回の 2 クエリドリルダウンバッチ</strong>(<strong>760 + 66 = 826 回の実行</strong>)が含まれます。ClickHouse の観測値は、<strong>1,132 億 1,956 万 5,734 行の基準範囲</strong>を通じて、Redshift の行の進捗に単調に揃えられています。その後の取り込み後の観測値は除外されています。</p>
<p class="note-heading"><strong>累積グラフ:</strong></p>

<p>クエリの所要時間は、将来の実行を前の位置に平滑化したり補間したりすることなく、対応する取り込み件数の時点でステップ合計として加算されます。準備コストの線は、取り込み全体の合計を行の進捗に応じて比例配分したものであり、時間ごとの従量課金コストの追跡ではありません。スコアは取り込み経過時間ではなく、クエリの所要時間を合計したものです。</p>
  </div>
</details>

**ClickHouse Cloud:**

- **中央値 722.5 ms** - Redshift Serverless より 98.6 倍高速
- **P99 1.15 秒** - 281 倍高速
- **最大 1.18 秒** - 378 倍高速

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

**Redshift Serverless:**

- **中央値 71.27 秒**
- **P99 322.96 秒**
- **最大 446.00 秒**

同一の 33 バッチ全体での累積ランタイムは **89.51 分**でした。増加し続けるストリーミングビューの読み取りには大幅に長い時間がかかり、D1 のウィンドウベースの 1 時間ごとのサマリーで、より大きなレイテンシ曲線が示されました。

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

<details class="note-box">
  <summary>なぜ Redshift のストリーミングビューを使用するのか、型付きカラムについてはどうか？(クリックして展開)</summary>
  <div class="note-body">
<p class="note-heading"><strong>ストリーミングビュー:</strong></p>

<p><a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/redshift-serverless/sql/setup_streaming.sql">ストリーミングビュー</a>はペイロードを SUPER として保持し、sym と t を型付きソートキーカラムに昇格させます。D1 と D2 は型付きの sym カラムをフィルタリングしてプルーニングの意図を維持し、結果を計算する際にペイロードのメジャーフィールドをキャストします。これは、ClickHouse の型付き生テーブルとは異なる表現です。</p>
<p class="note-heading"><strong>型付きの代替手段:</strong></p>

<p>兄弟関係にある型付き MV は、同一の (sym, t) ソートキーと EVEN 分散を使用して、ペイロードフィールドをカラムに射影します。そのクエリは同じ Redshift ドリルダウンロジックを実装しています。長期実行中には両方の表現が測定されました。</p>
<p class="note-heading"><strong>観測された結果:</strong></p>

<p>アクティブな取り込みの比較において、<a href="https://github.com/ClickHouse/CostBench/blob/main/full-path-realtime/quotes/redshift-serverless/results/t2/charts/drilldown_query_latency_redshift_super_vs_typed_wide_summary.json">型付きの代替手段</a>は<strong>ストリーミングビューの 2.11 倍のドリルダウンランタイムを累積</strong>しました。D1 はほぼ同等でしたが、D2 は型付きデータ上で <strong>4.42 倍低速</strong>でした。本記事では、測定結果がより高速であったストリーミングビューを読み取る代替手段を採用しています。</p>
<p class="note-heading"><strong>コストの境界:</strong></p>

<p>ライターと MSK の準備コストには両方の子リフレッシュが含まれており、読み取りの代替手段間で変更なく共有されます。ストリーミングビューのスコアには、型付きクエリの実行を追加するのではなく、その集約およびドリルダウンクエリの割り当て分のみが請求されます。</p>
<p class="note-heading"><strong>解釈:</strong></p>

<p>ベンチマークは、記録された完全なクエリ結果を測定します。バックグラウンドソート、ペイロードナビゲーション、クエリの構築、またはその他のエンジン処理に起因するギャップの大きさを個別に分離するものではありません。完全な実行結果が異なることを示している場合、短時間の特性評価から型付きレイアウトの方が高速であると想定することはできません。</p>
  </div>
</details>

### 整列された事前集計データに対するインタラクティブな集約

日次の事前集計により、[A1〜A4](https://clickhouse.com/ja/blog/costbench-real-time-performance-per-dollar-jp) は準備されたカウント、合計、価格の最小値および最大値を組み合わせることができます。A1〜A2 は銘柄別にサマリーをフィルタリングし、A3〜A4 はすべての銘柄にわたって読み取ります。ClickHouse は最新のサマリーを読み取り、Redshift は直近に完了した日次 MV リフレッシュを読み取ります。以下のチャートは、取り込みが継続する中での集約レイテンシを比較したものです。

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

**ClickHouse Cloud:**

- **中央値 13 ms** - Redshift Serverless より 34.6 倍高速
- **P99 42 ms** - 128 倍高速
- **最大値 111 ms** - 57.2 倍高速

4 クエリで構成される 190 バッチ全体で累積されたランタイムは **10.21 秒**でした。

**Redshift Serverless:**

- **中央値 449.4 ms**
- **P99 5.32 s**
- **最大値 6.35 s**

同一の 190 バッチ全体で累積されたランタイムは **12.05 分**でした。これらのクエリは、次回の更新を待つことなくリフレッシュ済みのサマリーを読み取ります。ClickHouse は挿入中にサマリーを維持しながらこれらをより高速に処理しました。一方、Redshift の測定されたレイテンシには、リフレッシュに依存する鮮度の境界が伴っていました。

> インタラクティブな集約ワークロード全体において、ClickHouse Cloud は挿入中にサマリーを維持しながら、**全体で 70.8 倍高速**でした。

### 累積クエリコストとランタイム

Redshift の累積クエリランタイムの大半はドリルダウンが占めています。以下のチャートは両方のワークロードを統合し、そのクエリ作業に割り当てられたリーダーコンピュートを示しています。

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

**システムあたり 826 回の承認された実行**全体において、ClickHouse Cloud の累積クエリランタイムは **58.12 秒**、Redshift は **1.69 時間**でした。正規化されたクエリ処理コストは、それぞれ約 **0.05 ドル**と **24.97 ドル**でした。これらは承認されたクエリ作業に起因するコストであり、プロバイダーの請求総額ではありません。

> ClickHouse Cloud はクエリワークロードを**全体で 104.8 倍高速**に処理し、**正規化されたクエリコストは 495 分の 1** でした。

## 実現場からの事例: Clay

Clay の顧客は、同社の Redshift レポーティングシステムの限界を感じていました。クレジット利用状況のダッシュボードは日常的にタイムアウトするかロードに時間がかかりすぎており、クエリレイテンシの P95 は約 60 秒でした。

レポーティングワークロードを ClickHouse に移行した後、Clay は回答の速度とその背景にあるデータの鮮度の両方を改善しました。ソフトウェアエンジニアの Paul Noble 氏は Open House での講演で、クエリレイテンシの P95 が約 60 秒から 1 秒に低下し、ダッシュボードのデータ鮮度が約 75 秒から 4 秒に改善したと報告しています。[Clay の移行事例を見る](https://clickhouse.com/videos/openhouse-nyc-clay)。

これらの改善は、顧客向けアナリティクスの 2 つの要件、すなわち最新のデータとインタラクティブに使用できる十分な応答速度に対処するものです。Clay の数値は同社自身の本番環境での移行について述べたものであり、CostBench は上記で説明した別の Redshift Serverless ワークロードを測定しています。

## Redshift Serverless がリアルタイムアナリティクスで ClickHouse Cloud に及ばない理由

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

- **① 準備コスト: 18.2 分の 1** (Redshift のライター＋MSK シナリオとの比較)
- **② 正規化されたクエリコスト: 495 分の 1** (承認されたクエリ作業全体)
- **③ 累積クエリランタイム: 104.8 分の 1** (両方のクエリワークロード全体)

最後のチャートはこれらの結果をまとめたもので、最新データが到着する中での累積クエリランタイムに対する、準備コストと正規化されたクエリコストの合計をプロットしています。

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

上に行くほどモデル化された総コストが低く、右に行くほど累積クエリランタイムが短くなります。

> **ClickHouse Cloud は、挿入中にサマリーを最新に保ちながら、このストリーミング比較において 1,996 倍優れたエンドツーエンドの 1 ドルあたりの性能を実現しました。**

その違いは準備経路から始まります。ClickHouse は挿入中に生の気配値をソートし、最新のサマリーを構築します。Redshift のストリーム、バックグラウンドソート、子 MV のリフレッシュは個別に進みます。そのドリルダウンにははるかに長い時間がかかり、集約クエリはリフレッシュ依存のスナップショットを読み取っているにもかかわらず低速でした。

これが、リアルタイムアナリティクスにおいて Redshift Serverless が ClickHouse Cloud に及ばない理由です。