メインコンテンツまでスキップ

クエリオプティマイザー

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

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

オプティマイザーの利点

よりスマート

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

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

より安定

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

サブクエリ処理を例に取ると、新しいオプティマイザーは新しいデータ構造に基づいて、古いオプティマイザーの多数のルールによるサブクエリの別々の処理を回避し、それにより最適化ルールにおける論理エラーの可能性を削減します。

より柔軟

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

オプティマイザーの原理

オプティマイザーの原理

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

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

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

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

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

セッション変数

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

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

  • デフォルト値: 30s

  • 適用シナリオ: クエリが大量の外部テーブルまたは特に複雑なクエリステートメントを含む場合、この値を適切に増加させて、クエリが正常に進行できるようにすることができます。