アナライザー
既知の非互換性
ClickHouse バージョン 24.3
から、新しいクエリアナライザーがデフォルトで有効になりました。
多くのバグ修正と新しい最適化の導入が行われましたが、ClickHouseの動作にいくつかの破壊的な変更ももたらしました。新しいアナライザー向けにクエリをどのように書き換えるかを判断するために、以下の変更をお読みください。
無効なクエリはもはや最適化されません
以前のクエリプランニングインフラは、クエリバリデーションステップの前にASTレベルの最適化を適用していました。 最適化により、初期クエリが書き換えられ、正当化(実行可能)となりました。
新しいアナライザーでは、クエリバリデーションは最適化ステップの前に行われます。 これにより、以前は実行可能だった無効なクエリは、サポートされなくなりました。 そのような場合、クエリを手動で修正する必要があります。
例 1:
次のクエリは、集計後に toString(number)
のみが利用可能な場合に、プロジェクションリストでカラム number
を使用しています。
旧アナライザーでは、GROUP BY toString(number)
は GROUP BY number
に最適化され、クエリが有効になりました。
例 2:
このクエリでも同様の問題が発生します:カラム number
は、別のキーで集約された後に使用されています。
以前のクエリアナライザーは、このクエリを修正するために HAVING
句から WHERE
句に number > 5
フィルターを移動しました。
クエリを修正するには、集約されていないカラムに適用されるすべての条件を WHERE
セクションに移動して、標準SQL構文に準拠する必要があります:
無効なクエリでの CREATE VIEW
新しいアナライザーでは、常に型チェックが行われます。
以前は、無効な SELECT
クエリを持つ VIEW
を作成することが可能でした。それは、最初の SELECT
または INSERT
(MATERIALIZED VIEW
の場合)で失敗しました。
現在では、そのような VIEW
を作成することは不可能です。
例:
JOIN
句の既知の非互換性
プロジェクションからのカラムを使用した結合
デフォルトでは、SELECT
リストのエイリアスは JOIN USING
キーとして使用できません。
新しい設定 analyzer_compatibility_join_using_top_level_identifier
を有効にすると、結合条件が SELECT
クエリのプロジェクションリストからの式に基づいて識別子を解決することを好むようになります。
例:
analyzer_compatibility_join_using_top_level_identifier
が true
に設定されている場合、結合条件は t1.a + 1 = t2.b
と解釈され、以前のバージョンの動作に一致します。したがって、結果は 2, 'two'
になります。
設定が false
の場合、結合条件はデフォルトで t1.b = t2.b
となり、クエリは 2, 'one'
を返します。
もし b
が t1
に存在しない場合、クエリはエラーで失敗します。
JOIN USING
と ALIAS
/MATERIALIZED
カラムの動作の変更
新しいアナライザーでは、ALIAS
または MATERIALIZED
カラムを含む JOIN USING
クエリで *
を使用すると、デフォルトで結果セットにこれらのカラムが含まれるようになります。
例:
新しいアナライザーでは、このクエリの結果には両方のテーブルからの id
と共に payload
カラムが含まれます。対照的に、以前のアナライザーは、特定の設定(asterisk_include_alias_columns
または asterisk_include_materialized_columns
)が有効にされている場合のみ、これらの ALIAS
カラムを含め、カラムが異なる順序で表示されることもありました。
古いクエリを新しいアナライザーに移行する際、一貫した期待どおりの結果を保証するために、SELECT
句でカラムを明示的に指定することをお勧めします。
USING
句のカラムに対する型修飾子の処理
新しいバージョンのアナライザーでは、USING
句に指定されたカラムの共通のスーパータイプを決定するルールが標準化され、LowCardinality
や Nullable
などの型修飾子を扱う際により予測可能な結果が得られます。
-
LowCardinality(T)
とT
:型LowCardinality(T)
のカラムが型T
のカラムと結合されると、結果の共通スーパータイプはT
となり、LowCardinality
修飾子が効果的に無視されます。 -
Nullable(T)
とT
:型Nullable(T)
のカラムが型T
のカラムと結合されると、結果の共通スーパータイプはNullable(T)
となり、nullable プロパティが保持されます。
例:
このクエリでは、id
の共通スーパータイプが String
と決定され、t1
から LowCardinality
修飾子が無視されます。
プロジェクションカラム名の変更
プロジェクション名の計算中に、エイリアスは置き換えられません。
非互換な関数引数の型
新しいアナライザーでは、型推論が初期クエリ分析中に行われます。
この変更により、型チェックが短絡評価の前に行われるため、if
関数の引数は常に共通スーパータイプを持っている必要があります。
例:
次のクエリは There is no supertype for types Array(UInt8), String because some of them are Array and some of them are not
というエラーで失敗します:
異種クラスタ
新しいアナライザーは、クラスタ内のサーバー間の通信プロトコルを大幅に変更しました。したがって、異なる enable_analyzer
設定値を持つサーバーで分散クエリを実行することは不可能です。
変更は以前のアナライザーに解釈されます
ミューテーションは依然として旧アナライザーを使用しています。これにより、一部の新しい ClickHouse SQL 機能は、ミューテーション内では使用できません。例えば、QUALIFY
句などです。
ステータスは こちら で確認できます。
サポートされていない機能
新しいアナライザーが現在サポートしていない機能のリスト:
- Annoy インデックス。
- Hypothesis インデックス。作業中 こちら。
- ウィンドウビューはサポートされていません。今後のサポート計画はありません。