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
またはINSERT
(MATERIALIZED 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_identifier
がtrue
に設定されている場合、結合条件はt1.a + 1 = t2.b
として解釈され、以前のバージョンの動作と一致します。この場合、結果は2, 'two'
になります。
設定がfalse
の場合、結合条件はt1.b = t2.b
にデフォルトされ、クエリは2, 'one'
を返します。
t1
にb
が存在しない場合、クエリはエラーで失敗します。
Changes in behavior with JOIN USING
and ALIAS
/MATERIALIZED
columns
新しいアナライザーでは、ALIAS
またはMATERIALIZED
カラムを含むJOIN USING
クエリで*
を使用すると、デフォルトでそれらのカラムが結果セットに含まれます。
例:
新しいアナライザーでは、このクエリの結果には両方のテーブルからのid
とpayload
カラムが含まれます。対照的に、以前のアナライザーは、特定の設定(asterisk_include_alias_columns
またはasterisk_include_materialized_columns
)が有効である場合にのみ、これらのALIAS
カラムを含むことがあり、カラムは別の順序で表示される可能性があります。
特に古いクエリを新しいアナライザーに移行する際に、一貫性のある期待通りの結果を保証するためには、*
を使用するのではなく、SELECT
句でカラムを明示的に指定することが推奨されます。
Handling of Type Modifiers for columns in USING
Clause
新しいアナライザーのバージョンでは、USING
句で指定されたカラムの共通スーパタイプを決定するルールが標準化され、特にLowCardinality
やNullable
のような型修飾子を扱う際により予測可能な結果を生み出します。
-
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はサポートされていません。将来的にサポートする予定はありません。