メインコンテンツまでスキップ
メインコンテンツまでスキップ

Analyzer

Known incompatibilities

ClickHouseバージョン24.3では、新しいクエリアナライザーがデフォルトで有効になりました。 多くのバグを修正し新しい最適化を導入したにもかかわらず、ClickHouseの動作にいくつかの破壊的変更も導入されました。新しいアナライザーに対して、クエリをどのように書き直すかを判断するために、以下の変更点をお読みください。

Invalid queries are no longer optimized

以前のクエリプランニングインフラストラクチャは、クエリ検証ステップの前にASTレベルの最適化を適用していました。 最適化は初期クエリを書き換え、有効なものにし、実行可能なものにすることができました。

新しいアナライザーでは、クエリ検証が最適化ステップの前に行われます。 これは、以前に実行可能だった無効なクエリが現在はサポートされていないことを意味します。 そのような場合、クエリを手動で修正する必要があります。

例 1:

以下のクエリは、集約後にtoString(number)しか利用できない場合に、プロジェクションリストでnumberカラムを使用しています。 古いアナライザーでは、GROUP BY toString(number)GROUP BY number,へ最適化され、クエリは有効になりました。

例 2:

このクエリでも同様の問題が発生します: numberカラムが他のキーで集約後に使用されています。 以前のクエリアナライザーは、HAVING句からWHERE句にnumber > 5フィルタを移動させてこのクエリを修正しました。

クエリを修正するには、非集約カラムに適用されるすべての条件をWHEREセクションに移動して、標準のSQL構文に従う必要があります:

CREATE VIEW with invalid query

新しいアナライザーは常に型チェックを実行します。 以前は、無効なSELECTクエリでVIEWを作成することが可能でした。このVIEWは最初のSELECTまたはINSERTMATERIALIZED VIEWの場合)で失敗していました。

現在は、そのようなVIEWを作成することはできません。

例:

Known incompatibilities of the JOIN clause

Join using column from projection

投影リストからのエイリアスは、デフォルトではJOIN USINGキーとして使用できません。

新しい設定analyzer_compatibility_join_using_top_level_identifierが有効になると、JOIN USINGの動作が変更され、SELECTクエリの投影リストの式に基づいて識別子を解決することが優先されます。

例:

analyzer_compatibility_join_using_top_level_identifiertrueに設定されている場合、結合条件はt1.a + 1 = t2.bとして解釈され、以前のバージョンの動作と一致します。この場合、結果は2, 'two'になります。 設定がfalseの場合、結合条件はt1.b = t2.bにデフォルトされ、クエリは2, 'one'を返します。 t1bが存在しない場合、クエリはエラーで失敗します。

Changes in behavior with JOIN USING and ALIAS/MATERIALIZED columns

新しいアナライザーでは、ALIASまたはMATERIALIZEDカラムを含むJOIN USINGクエリで*を使用すると、デフォルトでそれらのカラムが結果セットに含まれます。

例:

新しいアナライザーでは、このクエリの結果には両方のテーブルからのidpayloadカラムが含まれます。対照的に、以前のアナライザーは、特定の設定(asterisk_include_alias_columnsまたはasterisk_include_materialized_columns)が有効である場合にのみ、これらのALIASカラムを含むことがあり、カラムは別の順序で表示される可能性があります。

特に古いクエリを新しいアナライザーに移行する際に、一貫性のある期待通りの結果を保証するためには、*を使用するのではなく、SELECT句でカラムを明示的に指定することが推奨されます。

Handling of Type Modifiers for columns in USING Clause

新しいアナライザーのバージョンでは、USING句で指定されたカラムの共通スーパタイプを決定するルールが標準化され、特にLowCardinalityNullableのような型修飾子を扱う際により予測可能な結果を生み出します。

  • LowCardinality(T)T: 型LowCardinality(T)のカラムが型Tのカラムと結合されると、結果の共通スーパタイプはTとなり、LowCardinality修飾子が無効化されます。

  • Nullable(T)T: 型Nullable(T)のカラムが型Tのカラムと結合されると、結果の共通スーパタイプはNullable(T)となり、nullableプロパティが保持されます。

例:

このクエリでは、idの共通スーパタイプがStringとされ、t1からのLowCardinality修飾子が無視されます。

Projection column names changes

投影名の計算中に、エイリアスは置き換えられません。

Incompatible function arguments types

新しいアナライザーでは、型推論は初期クエリ分析中に行われます。 この変更により、型チェックはショートサーキット評価の前に行われるため、if関数の引数は常に共通スーパタイプを持っていなければなりません。

例:

以下のクエリは、There is no supertype for types Array(UInt8), String because some of them are Array and some of them are notというエラーで失敗します:

Heterogeneous clusters

新しいアナライザーは、クラスタ内のサーバ間の通信プロトコルを大幅に変更しました。そのため、異なるenable_analyzer設定値を持つサーバで分散クエリを実行することは不可能です。

Mutations are interpreted by previous analyzer

マテーションは依然として古いアナライザーを使用しています。 つまり、新しいClickHouse SQL機能のいくつかはマテーションでは使用できません。例えば、QUALIFY句。 ステータスはこちらで確認できます。

Unsupported features

新しいアナライザーが現在サポートしていない機能のリスト:

  • Annoy index.
  • Hypothesis index. 現在進行中 こちら.
  • Window viewはサポートされていません。将来的にサポートする予定はありません。