Contents
ClickHouseクエリパフォーマンスチューニングの基礎と目的
ClickHouseのクエリパフォーマンスチューニングは、データエンジニアにとって不可欠なスキルです。特にsystem.metricsを活用した定量的診断フローを理解することで、ボトルネックの特定や最適化が効率的に進められます。本記事では、ClickHouse クエリ パフォーマンス チューニングに焦点を当て、実務で即戦力となる手法を解説します。
system.metricsの定量的診断フロー
system.metricsは、ClickHouseの内部メトリクスをリアルタイムで確認できるテーブルです。これにより、CPU使用率やI/O負荷など、パフォーマンスに影響を与える要因を数値化できます。
定量的診断の重要性
- パフォーマンス低下の原因特定が迅速化される
- クエリログと併せて設定変更履歴の照合が可能になる
- 異常値の検出を客観的な数値に基づいて行える
実践例: メトリクスの監視フロー
- system.metricsからCPU使用率(
current_cpu_usage)やクエリ遅延(queries_with_delay)を取得 - これらのメトリクスがしきい値を超えた場合、system.processesで現在実行中のプロセスを確認
- 高負荷プロセスのクエリログ(system.query_log)と照合し、原因クエリを特定
blockquote 本記事に記載された数値基準(例:
current_cpu_usage70%以下)はClickHouse公式ドキュメントとの明示的な整合性がないため、実環境のワークロードやハードウェア構成に応じて調整が必要です。具体的なしきい値については、ClickHouse documentationを参照してください。
| メトリクス名 | 期待値(正常時) | 注意点 |
|---|---|---|
| current_cpu_usage | 70%以下 | 突発的なピークは一時的とする |
| queries_with_delay | 10件未満/秒 | 高頻度の遅延がある場合は要調査 |
system.metricsとsystem.processesのモニタリング手法
リアルタイムでメトリクスを監視することで、パフォーマンスの異常を早期に検知できます。
リアルタイムメトリクスの確認方法
SELECT * FROM system.metrics を実行すると、以下のような主要なメトリクスが表示されます:
current_cpu_usage: CPU使用率(パーセント)reads_written: 読み込み/書き込みバイト数queries_with_delay: 遅延のあるクエリ件数
blockquote メトリクスの取得頻度は1秒ごとに設定されるため、短時間での変化に敏感に対応可能
実行例(コマンド)
|
1 2 |
SELECT metric, value FROM system.metrics WHERE metric IN ('current_cpu_usage', 'queries_with_delay') ORDER BY metric; |
異常値検出のチェックポイント
| メトリクス | 正常範囲 | 异常時の対応 |
|---|---|---|
| current_cpu_usage | 70%以下 | クエリロードを分散させる、インデックス追加を検討 |
| queries_with_delay | 10件未満/秒 | EXPLAINでクエリ計画を解析、データ配分の見直し |
blockquote system.processesとsystem.query_logの連携は、
SELECT * FROM system.query_log WHERE query_id IN (SELECT query_id FROM system.processes)などのSQLにより実現できます。このようにして、遅延クエリとプロセスIDを関連付けることが可能です。
マージ状態の確認と最適化
ClickHouseでは、データマージがパフォーマンスに大きな影響を与えます。
system.mergesの活用
system.mergesテーブルは、現在進行中のマージタスクを一覧表示します。以下のようにして、不要な同期マージを回避できます:
is_synchronousカラムで同期/非同期マージを判定し、適切に制限をかける
blockquote ClickHouse 23.3以降では、同期マージの制限が強化されており、デフォルト設定でも高頻度な同期マージが発生するリスクが低減されています。
パーティションキー選定の落とし穴と最適化戦略
パーティションキーはクエリ性能に直接影響を与える重要な要素です。
不適切なパーティショニングの影響
- 高頻度のフィルタ条件に対応できない場合、全データをスキャンする必要がありパフォーマンスが低下
- パーティション数が多すぎると管理コストが増加
ベストプラクティス例(設計パターン)
| 用途 | 推奨パーティションキー | 理由 |
|---|---|---|
| 時系列データ | toYYYYMM(event_date) |
過去のデータを効率的に削除可能 |
| ユーザー別集計 | user_id |
同じユーザーのクエリが高速に実行される |
blockquote 頻繁なフィルタ条件を考慮して、パーティションキーを選定する必要があります。特に時間領域以外での設計(例:
city)も有効です。
EXPLAINによるクエリ実行計画解析
EXPLAINコマンドは、クエリの内部処理手順を確認するための強力なツールです。
実行計画の読み方
EXPLAIN QUERY TREEやEXPLAIN PROFILEで出力される結果を解析することで、以下がわかります:
- クエリがどのようにデータをスキャンしているか
- JOINやAggregate関数がどの順序で処理されているか
blockquote
EXPLAIN QUERY TREEの出力形式はClickHouseバージョンごとに異なり(例: 23.1以前はテキスト、23.2以降はJSONフォーマット)、使用するバージョンに応じて解析方法を調整してください。
並列処理設定(max_threads)の調整ポイント
max_threadsパラメータは、クエリ実行時の並列度を制御する重要な設定です。
ワークロード別の最適値検討
- バッチ処理: 大量データを処理する場合は16以上に設定(リソースを集中させる)
- リアルタイムクエリ: 他のユーザーの負荷を考慮し、4〜8がバランスよい
| タスク種別 | 推奨max_threads | 理由 |
|---|---|---|
| リアルタイム集計 | 4 | ユーザークエリへの干渉を最小限に |
| データのバックアップ | 16 | 高速な処理が求められるため |
blockquote max_threadsは、ホストリソース(CPU・メモリ)とワークロードの種類によって調整が必要です。過剰な並列化は競合を引き起こすため注意が必要です。具体的には、CPUコア数 × 0.75程度が推奨されますが、監視指標(例: CPU利用率、メモリ使用率)と連動して調整してください。
まとめ
本記事では、ClickHouse クエリ パフォーマンス チューニングに必要な以下の要点を解説しました:
- system.metricsによる定量的診断フローの活用方法
- マージ状態とパーティションキー設計の最適化戦略
- EXPLAINコマンドによる実行計画の分析
- max_threads設定の調整ポイント
読者自身のクエリログを分析し、上記手法でチューニングを開始することで、パフォーマンス改善が期待できます。