メインコンテンツへスキップ
ClickHouse はクエリを非常に高速に処理しますが、クエリ実行の仕組みはそれほど単純ではありません。SELECT クエリがどのように実行されるのかを見ていきましょう。これを説明するために、まず ClickHouse のテーブルにいくつかデータを追加してみます。
ClickHouse にデータが入ったので、いくつかのクエリを実行し、その実行の仕組みを見ていきましょう。クエリの実行はいくつもの段階に分解されます。クエリ実行の各段階は、対応する EXPLAIN クエリを使って分析し、トラブルシュートできます。これらの段階は以下の図にまとめられています。 クエリ実行時に各要素がどのように機能するのかを見ていきましょう。いくつかのクエリを取り上げ、EXPLAIN ステートメントを使って確認します。

パーサー

パーサーの目的は、クエリテキストを AST (抽象構文木) へ変換することです。この処理は、EXPLAIN AST を使って可視化できます。
出力は抽象構文木 (AST) で、以下のように可視化できます。 各ノードには対応する子ノードがあり、木全体でクエリ全体の構造を表しています。これはクエリを処理するための論理構造です。エンドユーザーの観点では (クエリ実行に関心がある場合を除き) 、それほど有用ではありません。このツールは主に開発者が使用します。

アナライザ

ClickHouse には現在、アナライザに 2 つのアーキテクチャがあります。古いアーキテクチャは、enable_analyzer=0 を設定することで使用できます。新しいアーキテクチャはデフォルトで有効になっています。新しいアナライザが一般提供になれば古いものは非推奨になる予定のため、ここでは新しいアーキテクチャについてのみ説明します。
新しいアーキテクチャは、ClickHouse のパフォーマンスを改善するための、より優れた基盤を提供するはずです。ただし、クエリ処理の中核となるコンポーネントであるため、一部のクエリに悪影響を及ぼす可能性があり、既知の非互換性 もあります。enable_analyzer 設定をクエリレベルまたはユーザーレベルで変更すれば、古いアナライザに戻せます。
アナライザは、クエリ実行における重要な段階です。AST を受け取り、それをクエリツリーに変換します。AST に対するクエリツリーの主な利点は、たとえばストレージのように、多くの部分が解決済みになることです。どのテーブルから読み取るかも分かり、別名も解決され、ツリーは使われているさまざまなデータ型も把握します。こうした利点により、アナライザは最適化を適用できます。これらの最適化は「パス」を通じて行われます。各パスは異なる最適化を探します。すべてのパスは こちら で確認できます。では、前のクエリを使って実際に見てみましょう。
2回の実行を比較すると、別名とPROJECTIONの解決を確認できます。

プランナー

プランナーはクエリツリーを受け取り、それを基にクエリプランを構築します。クエリツリーは特定のクエリで何を行いたいかを示し、クエリプランはそれをどのように実行するかを示します。追加の最適化もクエリプランの一部として行われます。クエリプランを確認するには、EXPLAIN PLAN または EXPLAIN を使用できます (EXPLAINEXPLAIN PLAN を実行します) 。
これでもある程度の情報は得られますが、さらに詳しい情報を取得できます。たとえば、どのカラムに対してPROJECTIONが必要なのか、そのカラム名を知りたい場合があります。ヘッダーをクエリに追加できます。
これで、最後の PROJECTION に対して作成する必要があるカラム名 (minimum_datemaximum_datepercentage) はわかりましたが、実行する必要があるすべての actions の詳細も確認したいことがあるでしょう。その場合は、actions=1 を設定します。
これで、使用されているすべての入力、関数、別名、データ型を確認できます。プランナーが適用する最適化の一部は、こちらで確認できます。

クエリパイプライン

クエリパイプラインはクエリプランから生成されます。クエリパイプラインはクエリプランと非常に似ていますが、ツリーではなくグラフである点が異なります。ClickHouse がクエリをどのように実行するか、またどのリソースが使用されるかを把握できます。クエリパイプラインを分析することで、入出力のどこにボトルネックがあるかを特定できます。前述のクエリを使って、クエリパイプラインの実行を確認してみましょう。
括弧内はクエリプランのステップ、その隣はプロセッサです。有益な情報ですが、グラフ構造であるため、視覚的に表示できると便利です。graph 設定を 1 に設定し、出力フォーマットを TSV に指定することができます:
この出力をコピーしてこちらに貼り付けると、以下のグラフが生成されます。 白い長方形はパイプラインノードを、灰色の長方形はクエリプランのステップを表し、x に続く数字は使用されている入力/出力の数を示します。コンパクト形式での表示が不要な場合は、compact=0 を追加してください:
ClickHouse はなぜ複数のスレッドでテーブルを読み込まないのでしょうか。テーブルにさらにデータを追加してみましょう:
それでは、EXPLAIN クエリをもう一度実行してみましょう。
つまり、データ量が十分でなかったため、エグゼキュータは処理を並列化しないと判断しました。さらに行を追加すると、グラフに示されているように、エグゼキュータは複数のスレッドを使用するようになりました。

エグゼキュータ

最後に、クエリ実行の最終段階はエグゼキュータが担います。エグゼキュータはクエリパイプラインを受け取り、実行します。SELECTINSERTINSERT SELECT のどれを実行するかによって、使用されるエグゼキュータの種類は異なります。
最終更新日 2026年7月2日