ドキュメントメニュー

Neutron がクエリを実行する仕組み#

Neutron は受け付けた SQL を、指定した Iceberg スナップショットに対して評価します。メモリは確保前に予算を決めるものというのが中心的な原則です。プロセスが大きくなってから確認するものではありません。

受付時に意味を確定する#

クエリのフロントエンドは 1 つの文を解析し、未対応の機能を分類し、レイク内の名前を解決して、スナップショットを選びます。Neutron には、確定したプランと範囲を限定したテーブルアクセスが渡されます。任意のカタログを接続したり、読み取り権限を書き込み権限に変えたりすることはできません。

方言と意味定義テーブルのバージョンも識別に使います。解析や値の意味が変わった場合は、別の言語の結果を黙って再利用せず、キャッシュした前提を無効にします。

メモリを明示的に管理する#

演算子は行、キー、デコードしたページ、退避用メタデータを保持する前にメモリを予約します。ハッシュ集計、結合、ソート、ウィンドウ処理、マテリアライズでは、それぞれ状態の大きさを制限します。先読みも、必要に応じた読み取りと同じ予算を消費します。

対象となるクエリが割り当てた予算を使い切った場合、Supernova はより大きなクラスで再試行できます。再試行でも SQL と選択したスナップショットを固定します。利用可能な最大容量に収まらないクエリは、制御不能なメモリ不足による強制終了をホストに任せず、失敗として扱います。

不要な読み取りを省く#

カタログのメタデータからマニフェスト、ファイル、行グループ、統計情報を特定します。射影の絞り込みにより、周囲のクエリで使わない列のデコードを省きます。述語の情報を使って、データを移動する前にファイルや行グループを除外できます。

メタデータとデータには別々の上限付きキャッシュを使います。大きなデータ範囲が、次の読み取りの計画に必要な小さなマニフェストを追い出さないためです。取得とデコードは、予約した予算内で並行して進めます。

決定性を区別する#

演算子は方言の契約に従って、順序、null、浮動小数点、タイムスタンプ、小数、JSON、コレクションの動作を定義します。order by のないクエリは表示順を保証しません。順序に依存する処理を含むクエリは、文書化した意味に従って一定の結果を返します。

Neutron は既存のエンジンと並行して、同じクエリを同じスナップショットに対して実行できます。比較では、完全一致、順序を問わない一致、許容差に基づく一致、比較不能を区別します。性能だけを理由に値の不一致を許容することはありません。

不正な結果をデータ破損として扱う#

クラッシュやリソース不足による拒否は目に見え、再試行できます。もっともらしい誤った行は、気付かれずにモデルや判断に入り込むため、より深刻です。そのため Neutron は意味の不一致を正確性のインシデントとして扱います。証拠を保存し、最初に分岐した演算子を特定し、影響を受ける処理を本番の主経路から外します。

この方針により、未対応の構文はその名前を示して拒否します。部分的に構文を受け入れてたまたま行を返すより、明確に拒否するほうが安全です。