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

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