- スパースプライマリ索引 - 選択したキーに基づいてディスク上のデータを並べ替えることで、クエリ時に無関係な行の広い範囲を ClickHouse がスキップできるようにします。
- 強化されたデータ型 - JSON、LowCardinality、Enum などの型をネイティブにサポートし、よりコンパクトな保存と高速な処理を可能にします。
- スキップ索引 と 全文索引 - クエリのフィルタ条件に一致しない granule を ClickHouse がスキップできるようにするセカンダリ索引構造で、特にテキスト検索ワークロードで効果を発揮します。
- 自動 compaction を備えた高速な insert - ClickHouse は高スループットの insert 向けに設計されており、バックグラウンドでデータパーツを自動的にマージします。これは、オープンテーブルフォーマットにおける compaction に相当します。
- 同時実行の読み取り向けに最適化 - MergeTree の列指向ストレージレイアウトは、複数の cache レイヤーと組み合わせることで、高い同時実行性が求められるリアルタイム分析ワークロードをサポートします。これはオープンテーブルフォーマットでは想定されていない用途です。
INSERT INTO SELECT を使用してカタログから MergeTree テーブルにデータを読み込む方法を説明します。
カタログに接続する
テーブルの一覧
Exploreでスキーマを確認する
データレイクのテーブルに対するクエリ
logger_name のようなカラムはカーディナリティが高すぎて、効果的にパーティション化できない場合があります。また、データをさらに絞り込むための Text indices のようなインデックスもありません。こうした場面で MergeTree が真価を発揮します。
MergeTree にデータをロードする
最適化されたテーブルを作成する
Nullableラッパーを使わない -Nullableを外すことで、ストレージ効率とクエリ性能が向上します。level、instance_type、thread_name、check_nameカラムに対するLowCardinality(String)- 値の種類が少ないカラムを辞書エンコードし、圧縮効率を高め、フィルタリングを高速化します。messageカラムの テキスト索引 -hasToken(message, 'error')のようなトークンベースのテキスト検索を高速化します。(instance_type, thread_name, toStartOfMinute(event_time))というORDER BYキー - 一般的なフィルタパターンに合わせてディスク上のデータを配置することで、スパースプライマリインデックス が不要なグラニュールをスキップできるようになります。
カタログからデータを取り込む
INSERT INTO SELECT を使用して、データレイクのテーブルにある約3億件のデータを ClickHouse テーブルに読み込みます。
クエリを再実行する
- スパースプライマリ索引 -
ORDER BY (instance_type, thread_name, ...)キーにより、ClickHouse はinstance_type = 'm6i.4xlarge'とthread_name = 'TCPHandler'に一致するグラニュールへ直接スキップできるため、処理する行数を 2 億 8300 万行からわずか 1400 万行まで削減できます。 - 全文索引 -
messageカラム上のtext_idx索引により、hasToken(message, 'error')はすべてのメッセージ文字列をスキャンするのではなく索引経由で解決され、ClickHouse が読み取る必要のあるデータをさらに減らせます。