メインコンテンツまでスキップ
バージョン: 4.x

クエリオプティマイザー

現在の情報技術環境において、クエリオプティマイザは複数の課題に直面しています。一方では、ユーザからのますます複雑なクエリ文と多様なクエリシナリオを処理する必要があり、他方では、ユーザはクエリのリアルタイム性能に対してますます厳しい要求を持ち、必要な結果への即座のアクセスを望んでいます。さらに、新たに出現する新しい要件に対処するため、クエリオプティマイザは迅速な反復と柔軟な適応の能力を備える必要があります。

この背景に基づき、Dorisは全く新しいクエリオプティマイザの開発に着手しました。現代的なオプティマイザアーキテクチャを活用することで、このオプティマイザは現在のDorisシナリオにおけるクエリリクエストをより効率的に処理することを目指しており、同時に優れたスケーラビリティを提供し、将来のより複雑な要求の可能性に対して堅固な基盤を築きます。

オプティマイザの利点

よりスマート

オプティマイザはRBO(Rule-Based 最適化)とCBO(Cost-Based 最適化)の各最適化ポイントをルールの形で明確に提示します。各ルールについて、オプティマイザはクエリプランの形状を記述する一連のパターンを提供し、最適化可能なクエリプランの正確なマッチングを可能にします。そのため、オプティマイザはネストした多層サブクエリなど、より複雑なクエリ文をより良くサポートできます。

同時に、オプティマイザのCBOは高度なCascadesフレームワークに基づいており、豊富な統計データ、データ特性情報、および細心に調整されたコストモデルを十分に活用します。これにより、オプティマイザは複数Table結合などの複雑なクエリを容易かつ熟練して処理することができます。

より安定

オプティマイザのすべての最適化ルールは論理実行プランツリー上で実行されます。クエリの構文と意味解析の後、クエリはツリー構造に変換されます。旧オプティマイザと比較して、新オプティマイザの内部データ構造はより合理的で統一されています。

サブクエリ処理を例に取ると、新オプティマイザは新しいデータ構造に基づき、旧オプティマイザの多数のルールによるサブクエリの個別処理を回避し、最適化ルールでの論理エラーの可能性を減らします。

より柔軟

オプティマイザのアーキテクチャは合理的かつ現代的に設計されており、最適化ルールと処理段階の拡張が非常に便利です。そのため、我々は進化する新しい要件を満たすために迅速に新機能を追加できます。

オプティマイザの原理

Principles of the Optimizer

オプティマイザの実行プロセスは以下のステップに分かれます:

  1. 構文解析:オプティマイザはSQLテキストを抽象構文木(AST)に変換しようとします。SQLテキストが有効であれば次のステップに進み、無効であればエラーを報告して実行を終了します。

  2. 意味解析:オプティマイザはAST内の要素に対して意味解析を実行します。このステップでは、SQLクエリ内のTable、カラム、関数などが存在するか、およびそれらの使用が構文と意味ルールに準拠しているかをチェックします。意味が有効であれば実行を継続し、無効であればエラーを報告して実行を終了します。

  3. クエリプラン書き換え(RBO):構文と意味解析の後、オプティマイザはRule-Based 最適化(RBO)を実行します。このステップでは、一連の事前定義されたルールを通じてクエリプランを書き換え、実行速度を決定論的に最適化します。一般的な最適化技術にはカラムプルーニング、述語プッシュダウン、パーティションプルーニングなどがあります。

  4. クエリプラン最適化(CBO):最後に、オプティマイザはCost-Based 最適化(CBO)を実行します。このステップでは、オプティマイザは検索空間で等価プランセットを列挙し、それらの実行コストを評価します。異なるプランの実行コストを比較することで、オプティマイザは最も低いコストのプランを最終実行プランとして選択します。このステップは、クエリが最も効率的な方法で実行されることを確保し、最適なパフォーマンスを提供することを目的としています。

セッション変数

1. プランニングタイムアウト設定 nereids_timeout_second

  • この変数はクエリプランニングに許可される最大時間を設定するために使用されます。プランニング時間がこの設定値を超えると、クエリプランニングは終了し、エラーメッセージが返されます。クエリ文をプランニングする過程で、システムはSQL内に含まれるすべてのTableの読み取りロックを取得します。これは主にクラスタの安定性を維持し、過度に長いプランニング時間による過剰なリソース占有とロック競合を防ぐためです。

  • デフォルト値:30s

  • 適用シナリオ:クエリが大量の外部Tableや特に複雑なクエリ文を含む場合、この値を適切に増加して、クエリが正常に進行できることを確保できます。