メインコンテンツへスキップ
前のセクションでは、ClickHouse をデータカタログに接続し、オープンテーブルフォーマットを直接クエリしました。データをその場でクエリできるのは便利ですが、オープンテーブルフォーマットは、ダッシュボードや運用レポートを支える低レイテンシ・高い同時実行性が求められるワークロード向けには最適化されていません。こうしたユースケースでは、データを ClickHouse の MergeTree エンジンに読み込むことで、はるかに高いパフォーマンスを得られます。 MergeTree には、オープンテーブルフォーマットを直接読み取る場合と比べて、いくつかの利点があります。
  • スパースプライマリ索引 - 選択したキーに基づいてディスク上のデータを並べ替えることで、クエリ時に無関係な行の広い範囲を ClickHouse がスキップできるようにします。
  • 強化されたデータ型 - JSONLowCardinalityEnum などの型をネイティブにサポートし、よりコンパクトな保存と高速な処理を可能にします。
  • スキップ索引全文索引 - クエリのフィルタ条件に一致しない granule を ClickHouse がスキップできるようにするセカンダリ索引構造で、特にテキスト検索ワークロードで効果を発揮します。
  • 自動 compaction を備えた高速な insert - ClickHouse は高スループットの insert 向けに設計されており、バックグラウンドでデータパーツを自動的にマージします。これは、オープンテーブルフォーマットにおける compaction に相当します。
  • 同時実行の読み取り向けに最適化 - MergeTree の列指向ストレージレイアウトは、複数の cache レイヤーと組み合わせることで、高い同時実行性が求められるリアルタイム分析ワークロードをサポートします。これはオープンテーブルフォーマットでは想定されていない用途です。
このガイドでは、より高速な分析を実現するために、INSERT INTO SELECT を使用してカタログから MergeTree テーブルにデータを読み込む方法を説明します。

カタログに接続する

前のガイドで使用したものと同じ Unity Catalog 接続を使い、Iceberg REST エンドポイント経由で接続します。

テーブルの一覧

Exploreでスキーマを確認する

このテーブルには、ClickHouse CI のテスト実行による約2億8,300万行のログが含まれており、分析性能を検証するための現実的なデータセットとなっています。

データレイクのテーブルに対するクエリ

スレッド名とインスタンスタイプでログを絞り込み、メッセージテキスト内のエラーを検索し、結果をロガーごとにグループ化するクエリを実行してみましょう。
このクエリに 9秒近く かかるのは、ClickHouse がオブジェクトストレージ内のすべての Parquet ファイルに対してフルテーブルスキャンを実行する必要があるためです。パーティション化によってパフォーマンスを改善できる可能性はありますが、logger_name のようなカラムはカーディナリティが高すぎて、効果的にパーティション化できない場合があります。また、データをさらに絞り込むための Text indices のようなインデックスもありません。こうした場面で MergeTree が真価を発揮します。

MergeTree にデータをロードする

最適化されたテーブルを作成する

スキーマを最適化するための工夫をいくつか加えた MergeTree テーブルを作成します。Iceberg のスキーマとの主な違いは次のとおりです。
  • Nullable ラッパーを使わない - Nullable を外すことで、ストレージ効率とクエリ性能が向上します。
  • levelinstance_typethread_namecheck_name カラムに対する LowCardinality(String) - 値の種類が少ないカラムを辞書エンコードし、圧縮効率を高め、フィルタリングを高速化します。
  • message カラムの テキスト索引 - hasToken(message, 'error') のようなトークンベースのテキスト検索を高速化します。
  • (instance_type, thread_name, toStartOfMinute(event_time)) という ORDER BY キー - 一般的なフィルタパターンに合わせてディスク上のデータを配置することで、スパースプライマリインデックス が不要なグラニュールをスキップできるようになります。

カタログからデータを取り込む

INSERT INTO SELECT を使用して、データレイクのテーブルにある約3億件のデータを ClickHouse テーブルに読み込みます。

クエリを再実行する

ここで同じクエリを MergeTree テーブルに対して実行すると、パフォーマンスが大幅に向上することがわかります。
同じクエリは現在 0.22秒 で完了し、約40倍 の高速化を達成しています。この改善を支えている主な最適化は 2 つあります。
  • スパースプライマリ索引 - ORDER BY (instance_type, thread_name, ...) キーにより、ClickHouse は instance_type = 'm6i.4xlarge'thread_name = 'TCPHandler' に一致するグラニュールへ直接スキップできるため、処理する行数を 2 億 8300 万行からわずか 1400 万行まで削減できます。
  • 全文索引 - message カラム上の text_idx 索引により、hasToken(message, 'error') はすべてのメッセージ文字列をスキャンするのではなく索引経由で解決され、ClickHouse が読み取る必要のあるデータをさらに減らせます。
その結果、このクエリはリアルタイムダッシュボードを十分に支えられるようになり、しかもその規模とレイテンシは、オブジェクトストレージ内の Parquet ファイルをクエリする方法では及びません。
最終更新日 2026年7月1日