クエリオプティマイザー
現在の情報技術環境において、クエリオプティマイザーは複数の課題に直面しています。一方では、ユーザーからの複雑さを増すクエリ文と多様なクエリシナリオに対処する必要があり、他方では、ユーザーのクエリリアルタイム性能への要求はますます厳しくなり、必要な結果への即座のアクセスを望んでいます。さらに、新たに現れる新しい要求に対処するため、クエリオプティマイザーは迅速な反復と柔軟な適応の機能を持たなければなりません。
この背景を受けて、Dorisは全く新しいクエリオプティマイザーの開発に着手しました。現代的なオプティマイザーアーキテクチャを活用し、このオプティマイザーは現在のDorisシナリオでのクエリリクエストをより効率的に処理し、優れたスケーラビリティを提供することを目的とし、将来のより複雑な可能性のある需要に対する強固な基盤を築いています。
オプティマイザーの利点
よりスマート
オプティマイザーは、RBO(Rule-Based Optimization)とCBO(Cost-Based Optimization)の各最適化ポイントをルールの形式で明確に提示します。各ルールに対して、オプティマイザーはクエリプランの形状を記述するパターンセットを提供し、最適化可能なクエリプランの正確なマッチングを可能にします。そのため、オプティマイザーは入れ子になった多層サブクエリなど、より複雑なクエリ文をより適切にサポートできます。
同時に、オプティマイザーのCBOは先進的なCascadesフレームワークに基づき、豊富な統計データ、データ特性情報、および細心に調整されたコストモデルを最大限に活用します。これにより、オプティマイザーは複数テーブルの結合のような複雑なクエリを容易かつ熟練して処理できます。
より安定
オプティマイザーのすべての最適化ルールは論理実行プランツリー上で実行されます。クエリの構文と意味解析後、クエリはツリー構造に変換されます。旧オプティマイザーと比較して、新しいオプティマイザーの内部データ構造はより合理的で統一されています。
サブクエリ処理を例にとると、新しいオプティマイザーは新しいデータ構造に基づき、旧オプティマイザーの多数のルールによる個別のサブクエリ処理を回避し、最適化ルールの論理エラーの可能性を減らします。
より柔軟
オプティマイザーのアーキテクチャは合理的かつ現代的に設計されており、最適化ルールと処理段階の拡張が非常に便利です。そのため、変化する新しい要求に対応するために新機能を迅速に追加できます。
オプティマイザーの原理

オプティマイザーの実行プロセスは以下のステップに分かれています:
-
構文解析:オプティマイザーはSQLテキストをAbstract Syntax Tree(AST)に変換しようと試みます。SQLテキストが有効な場合は次のステップに進み、無効な場合はエラーを報告して実行を終了します。
-
意味解析:オプティマイザーはAST内の要素に対して意味解析を実行します。このステップでは、SQLクエリ内のテーブル、列、関数などが存在するか、およびそれらの使用が構文と意味ルールに準拠しているかを確認します。意味が有効な場合は実行を継続し、無効な場合はエラーを報告して実行を終了します。
-
クエリプランの書き換え(RBO):構文と意味解析後、オプティマイザーはRule-Based Optimization(RBO)を実行します。このステップでは、一連の事前定義されたルールを通じてクエリプランを書き換え、実行速度を確定的に最適化します。一般的な最適化技術には、列のプルーニング、述語のプッシュダウン、パーティションプルーニングなどが含まれます。
-
クエリプランの最適化(CBO):最後に、オプティマイザーはCost-Based Optimization(CBO)を実行します。このステップでは、オプティマイザーは検索空間内の等価プランセットを列挙し、それらの実行コストを評価します。異なるプランの実行コストを比較することで、オプティマイザーは最低コストのプランを最終実行プランとして選択します。このステップは、クエリが最も効率的な方法で実行されることを保証し、最適なパフォーマンスを提供することを目的としています。
セッション変数
1. プランニングタイムアウトの設定 nereids_timeout_second
-
この変数は、クエリプランニングに許可される最大時間を設定するために使用されます。プランニング時間がこの設定値を超えると、クエリプランニングが終了し、エラーメッセージが返されます。クエリ文をプランニングするプロセス中、システムはSQL内のすべての関連テーブルの読み取りロックを取得します。これは主にクラスターの安定性を維持し、過度に長いプランニング時間によって引き起こされる過剰なリソース占有とロック競合を防ぐためです。
-
デフォルト値:30s
-
適用シナリオ:クエリが大量の外部テーブルまたは特に複雑なクエリ文を含む場合、この値を適切に増やして、クエリが正常に進行できるようにすることができます。