この記事は、Huawei クラウド コミュニティ「[GaussTech Issue 2] GaussDB SQL クエリ ステートメント実行プロセスの分析」 (著者: GaussDB データベース) から共有されたものです。
リレーショナル データベースにとって SQL の重要性は自明です。オーケストラの指揮者のように、作品の正しい解釈とリズムの調和と統一を導きます。新世代のリレーショナル分散データベースとして、Huawei Cloud GaussDB は優れた技術パフォーマンスと業界競争力を備えています。多くの人が GaussDB の主要なテクノロジーに興味を持ち、フォーラムにメッセージを残しています。
今日は、GaussDB SQL エンジンから始めて、GaussDB SQL エンジンの原理や重要な技術点など、GaussDB SQL クエリ ステートメントの実行プロセスについて学びます。
理解の過程で質問や重要な技術的ポイントがある場合は、[Yunka Q&A] に参加して GaussDB SQL エンジンの謎を解明し、対話してギフトを獲得し、対話のためのメッセージを残すことができます。専門家が 1 対 1 で面会します。 -one 質問に答えると、質問に対する報酬を獲得するチャンスがあります。
↓↓↓↓以下本文です
まず、GaussDB のシステム構造を簡単に紹介し、次に GaussDB SQL クエリ ステートメントの実行プロセスを分析しましょう。
GaussDB システム アーキテクチャ
図(1) 集中型
図(2) 分布
GaussDB SQL ステートメントの実行中には、次の重要な役割が関係します。
GTM |
グローバル トランザクション マネージャーは、グローバル トランザクション ID、トランザクション スナップショット、タイムスタンプ、シーケンス情報などのグローバルに一意な情報の生成と維持を担当します。 |
CN |
コーディネーターノード。アプリケーションからのアクセス要求を受信し、実行結果をクライアントに返す責任を負い、タスクを分解し、各 DN で並行して実行されるタスク シャードをスケジュールする責任を負います。各 CN は各 DN に接続されており、各 CN は同じメタデータ内容のメタデータのコピーを保持します。 |
DN |
データノード。ビジネス データの保存 (行ストレージ、列ストレージ、およびハイブリッド ストレージをサポート)、データ クエリ タスクの実行、および CN への実行結果の返しを担当します。 |
このうち、DN は主に GaussDB SQL ステートメントの実行を担当します。その論理アーキテクチャを次の図に示します。
図(3) GaussDBの論理アーキテクチャ
GaussDB には、SQL エンジン とストレージ エンジン という 2 つの主要なエンジンが含まれています。 SQL エンジンはクエリ プロセッサと呼ばれることもあり、その主な機能は SQL 解析、クエリ最適化、クエリ実行です。 SQL 解析では、入力 SQL ステートメントに対して字句分析、構文分析、および意味分析を実行して、クエリ ツリーを生成します。クエリ ツリーにルール最適化 (RBO) とコスト最適化 (CBO) が適用された後、実行プランが生成されます。エグゼキュータは、実行計画に基づいて関連データの抽出、操作、更新、削除などの操作を行い、ユーザーがクエリしたい結果を実現します。
ストレージ エンジンは、すべてのデータ I/O の管理を担当します。これには、データの読み取りおよび書き込み処理 (行、インデックス、ページ、割り当て、および行バージョンの I/O 要求の処理)、データ バッファー管理 (バッファー プール)、およびトランザクションが含まれます。マネージャー。このうち、トランザクション管理には、ACID 属性を維持するロック機構 (Lock) とトランザクション ログ管理 (XLOG) が含まれます。
SQL エンジンとストレージ エンジンの間には AM (アクセス メソッド) 層があります。 AM は、複数のストレージ エンジン (Astore、Ustore など) をサポートするためにストレージ層をカプセル化します。 SQL 層はストレージ層を直接呼び出すのではなく、AM 層を介して、異なるストレージ エンジンに応じて異なる実行本体を呼び出します。
GaussDB の論理アーキテクチャ図から、GaussDB アーキテクチャ設計が、統合トランザクション メカニズム、統合ログ システム、統合同時実行制御システム、統合メタ情報システム、および統合キャッシュ管理システム。したがって、GaussDB の技術アーキテクチャには次の主な機能があります。
-
SQL の最適化、実行、ストレージ層の分離をサポートします。
-
プラグ可能なストレージ エンジンをサポートします。
SQLクエリ文の実行処理
SQL クエリ (SELECT) ステートメントの実行プロセスは次のとおりです。
図(4) Query文の実行処理
上の図からわかるように、SQL ステートメントは、SQL 解析を通じてクエリ ツリーを生成し、クエリの最適化によって実行プランを生成し、その実行プランをクエリ エグゼキューターに転送して物理演算子の実行操作を実行する必要があります。
SQL は関係代数と関係代数の間の記述言語であり、関係代数の「手続き」部分を放棄しながら、関係代数のいくつかの論理演算子の記述を吸収します。 SQL 解析の主な機能は、SQL ステートメントを関係演算子で構成されるクエリ ツリーにコンパイルすることです。これには通常、字句解析、構文解析、および意味解析サブモジュールが含まれます。
ルール最適化 (RBO) は、クエリ ツリーに基づいて等価リレーショナル代数変換を実行し、SQL ステートメントをより効率的な等価 SQL に変換し、データベース オプティマイザーで重要な役割を果たします。特に複雑なクエリでは、パフォーマンスが大幅に向上します。
クエリ実行とは、実行計画に従ってSQLクエリ文を実行することです。基礎となるストレージ方法の選択の合理性は、クエリの実行効率に影響します。
パーサー
1.字句解析:クエリ文からシステムがサポートするキーワード、識別子、演算子、端子などを特定し、各単語の固有品詞を判断します。
SQL 標準では、SQL キーワードと文法規則情報が定義されており、字句解析プロセス中に、GaussDB はキーワード情報と間隔情報に基づいて SQL ステートメントを独立したアトミック単位に分割し、各単位が単語として表示されます。
2.文法分析: 定義された SQL 文法規則に従って、字句分析で生成された単語を使用して文法規則と照合し、対応する抽象構文ツリー (AST) を生成します。
3.セマンティック解析: 構文ツリーの有効性をチェックし、構文ツリー内の対応するテーブル、列、関数、式に対応するメタデータがあるかどうかを確認し、抽象構文ツリーをクエリ ツリーに変換します。
意味解析のプロセスは、意味分析の検査を通じて、抽象構文ツリーがクエリ ツリーに変換される、有効性意味結合のプロセスでもあります。クエリ ツリーは関係代数式の形式で表現できます。
オプティマイザ
オプティマイザーは、クエリの効率を向上させるための非常に重要な手段です。これには、ルールの最適化とクエリの最適化の 2 つの部分が含まれます。
ルール最適化は、クエリツリーに基づく等価な関係代数変換です。関係代数に基づく最適化形式であるため、代数最適化とも呼ばれます。 2 つの関係代数式によって得られる結果はまったく同じですが、それらの実行コストは大きく異なる可能性があり、これがルール最適化の基礎となります。
ルールの最適化は、次の 2 つの基本原則に従います。
(1) 等価性: 元のステートメントと書き換えられたステートメントの出力結果は同じです。
(2) 効率: 書き換えられたステートメントは、元のステートメントよりも実行時間が短くなり、リソースがより効率的に使用されます。
GaussDB は、次のようないくつかの主要なルール最適化手法を実装しています。
述語プッシュダウン: 条件付きフィルタリングを早期にトリガーし、処理される行数を削減します。
冗長な演算の削除: 冗長なテーブルとカラムを削除して計算量を削減します。
サブクエリの昇格: 昇格後は、より多くの結合順序が照合可能になります
外部から内部への変換: 内部結合はより多くの結合順序に一致します
サブリンクの推進: サブプランとブロードキャスト操作を削減します。
不等結合を排除: NestLoop と Broadcast オペレーションを削減
多数の顧客にサービスを提供する過程で、GaussDB はビジネス SQL の使用パターンを抽象化し、いくつかの高度な書き換えルールを実装します。今後のコラムでは、GaussDB のルール最適化技術について詳しく紹介していきます。
クエリの最適化
クエリの最適化は、「ルールの最適化」の出力をもとに、データベースの内部統計情報と組み合わせて、SQL文の具体的な実行方法、つまり実行計画を立案します。さまざまな最適化手法に基づいて、クエリ最適化テクノロジは次のように分類できます。
(1) CBO (Cost Based Optimization、コストベースのクエリ最適化): SQL 文に対応する実行パスの候補のコストを見積もり、候補パスの中から最もコストの低い実行パスを最終的な実行計画として選択します。
(2) ABO (AI Based Optimization、機械学習に基づくクエリ最適化): ABO は、過去の経験の継続的な学習を通じて、ターゲット シナリオのパターンを抽象化し、動的モデルを形成し、ユーザーの実際のシナリオを適応的に最適化します。最適な実行計画。
GaussDB は CBO ベースの最適化テクノロジーを使用し、それを ABO と組み合わせて、モデリングの効率、推定精度、適応性を積極的に検討します。手順は次のとおりです。
図 (5) クエリ最適化の手順
統計情報モデル: 統計情報はプラン パス コストの計算の基礎であり、コスト見積もりモデルの行数の見積もりとコストの見積もりにおいて重要な役割を果たし、クエリ プランの品質に直接影響します。 GaussDB ベース テーブル データの特性には、個別値、MCV (Most Common Values) 値、ヒストグラムなどが含まれます。
行の見積もり: 制約によって選択率が決定された後、計画されたパスごとに処理する必要がある行数を決定でき、準備する行数に基づいて処理する必要のあるページ数を計算できます。コストの見積り。
コスト見積もり: データ量に基づいてさまざまなオペレーターの実行コストを見積もります。各オペレーターのコストの合計が計画の総コストとなります。
計画されたパスがページを処理する場合は I/O コストが発生し、計画されたパスがタプルを処理する場合 (タプルの式評価など)、CPU コストが発生します。 GaussDB は分散データベースであるため、CN と DN の間でデータを送信すると通信コストが発生します。したがって、プランの総コストは次のように表すことができます。
総コスト = IO コスト + CPU コスト + 通信コスト
-
経路探索:経路最適化アルゴリズム(動的計画法、遺伝的アルゴリズム)を解くことで接続経路探索処理を処理し、最小の探索空間で最適な接続経路を探索します。
GaussDB は、ボトムアップ検索モードとランダム検索モードを組み合わせて使用します。検索プロセスは、クエリ ツリーから実行プランに変換するプロセスでもあります。たとえば、各テーブルには異なるスキャン演算子を含めることができ、論理結合演算子をさまざまな異なる物理結合演算子に変換することもできます。
-
プランの生成: クエリの実行パスを実行プラン (PlanTree) に変換し、それを実行のためにエグゼキュータに提供します。
クエリの最適化には、特に複雑なクエリを処理する場合に時間がかかることがあります。プラン キャッシュはGaussDB の重要な機能であり、クエリ ステートメントの実行プランをキャッシュして、次回同じクエリを実行するときにキャッシュ内の実行プランを直接使用できるため、計算の繰り返しが回避され、クエリのパフォーマンスが最適化されます。
分散クエリの最適化
ネイティブ分散データベースとして、分散クエリ最適化テクノロジは特に重要です。
GaussDB 分散アーキテクチャは各ノードのコンピューティング リソースを最大限に活用し、ノードの規模が拡大するにつれて全体的なパフォーマンスが直線的に向上します。分散アーキテクチャ下でパフォーマンスとリソース使用率を最大化するために、GaussDB は、次の図に示すように、CN ライトウェイト プラン、FQS (Fast Query Shipping) プラン、ストリーム プラン、およびリモート クエリ プランという 4 つの分散プランをサポートしています。
図 (6) 4 つの分散プラン
-
CN 軽量: ステートメントは実行のために単一の DN に直接送信されます (LIGHT_PROXY)
-
実行原理: CN は、ソケットを通じてステートメント QPBE メッセージを対応する DN に直接配信します。
-
-
適用可能なシナリオ: ステートメントは DN 上で直接実行できます (単一シャード ステートメント)。
-
FQS (Fast Query Shipping) ステートメントの発行: SQL ステートメントの発行計画
(REMOTE_FQS_QUERY)
-
実行原理: CN は、オプティマイザーを経由せずに RemoteQuery プランを直接生成し、エグゼキューター ロジックを通じて DN に送信します。各DNはプッシュダウン文に基づいて実行計画を生成して実行し、実行結果はCN上にまとめられます。
-
-
-
適用可能なシナリオ: ステートメントは実行のために複数の DN に完全にプッシュダウンでき、DN 間でのデータのやり取りは必要ありません。
-
-
STREAM プランの配信: 分散 SQL プランの配信プラン (STREAM)
-
実行原理: CN は、オプティマイザーを介して元のステートメントに基づいてストリーム オペレーターを含む実行プランを生成し、それを実行のために DN に送信します。DN の実行プロセス中にデータ対話 (ストリーム ノード) が発生します。ストリーム オペレーターはデータ交換のために DN 間の接続を確立し、CN は実行結果を要約します。 DN はほとんどの計算を引き受けます。
-
-
-
適用可能なシナリオ:実行中に CN と DN の間、および DN と DN の間でデータ対話が行われる複雑なステートメント。
-
-
リモートクエリプラン: いくつかの SQL ステートメントを発行するための分散プラン (REMOTE_QUERY)
-
実行原理: CN はオプティマイザを介して元のステートメントの一部から RemoteQuery プランを生成し、DN が実行された後、中間結果データを CN に送信し、実行計算を実行します。したがって、残りの実行計画は CN によって計算されます。
-
-
適用可能なシナリオ:最初の 3 つの世代条件を満たさないシナリオはほとんどなく、パフォーマンスは非常に悪いです。
分散アーキテクチャでは、同じテーブルのデータが異なるデータ ノードに分散されます。テーブルを作成するときに、各テーブルのデータをハッシュするかランダムに分散するかを選択できます。 2 つのテーブル間の結合操作を正しく実行するには、2 つのテーブルのデータを再分散する必要がある場合があります。そのため、GaussDB の分散実行プランには、データを特定の分散方法にする 3 つの Stream 演算子が追加されます。
図(7) ストリーム演算子
分散パスを生成する際には、2 つのテーブル上のデータと接続条件が同じデータ ノード内にあるかどうかが考慮され、そうでない場合は、対応するデータ分散演算子が追加されます。再分散ストリーム オペレーターは、DN ノード間のデータ フローを削減するという原則に基づいて選択されます。
GaussDB が分散アーキテクチャで大規模なデータを処理できるのは、まさに Stream 演算子の合理的な使用に基づいています。 Stream 演算子の最適化も、GaussDB クエリ最適化の重要な部分です。
図(8) GaussDBの分散クエリ最適化技術
[主な技術ポイント]分散クエリの最適化: 4 つの分散実行プランと 3 つの Stream オペレーター。
アクチュエーター
エグゼキューターが受け取る命令は、SQL クエリ ステートメントに対してオプティマイザーによって生成された実行プランです。実行プランはいくつかの実行演算子 (演算子) や式などで構成されます。主に関係セットに基づいて動作し、最終的にユーザーの希望する結果を出力します。必要な結果セット。一般的な実行演算子のタイプをいくつか次に示します。
1. スキャン計画ノード
スキャン ノードは、ファイル システムやネットワークなど、基礎となるデータ ソースからデータを抽出する役割を果たします。一般に、スキャン ノードは実行ツリーのリーフ ノードに配置され、実行用のデータ入力ソースとして機能し、通常は SeqScan、IndexScan、SubQueryScan を表します。
主な機能: 入力データ、リーフノード、式フィルタリング
2. 制御計画ノード
制御演算子は通常、代数演算子をマップしませんが、Executor が Limit、RecursiveUnion、Union などの特別なプロセスを完了するために導入される演算子です。
主な機能: データ フローの制御に使用されます
3. 計画ノードの具体化
マテリアライズされた演算子は一般に、演算子ロジック処理を実行する場合、下位層のデータをキャッシュする必要があるため、下位層の演算子によって返されるデータの量を事前に予測することができません。すべてのデータを配置できないメモリ条件 (Agg、Sort など)。
主な機能: 返す前にすべてのデータをスキャンする必要がある
4. 結合プラン ノード 演算子は、データベース内の最も一般的な関連付け操作を処理するように設計されており、さまざまな処理アルゴリズムとデータ入力ソースに従って MergeJoin、NestLoop Join、および HashJoin に分類されます。
主な機能: 関連クエリ
5. その他の事業者
エグゼキュータのアーキテクチャとテクノロジも、データベース クエリ実行の全体的な動作効率を決定します。 GaussDB 実行エンジンは、最新のハードウェア テクノロジの特性を完全に組み合わせており、効率的な実行のためにベクトル化エンジンや LLVM などのさまざまな最新のソフトウェア テクノロジを使用しています。
図 (9) GaussDB の完全並列実行アーキテクチャ
GaussDB は、分散プランの実行中のクエリ実行パフォーマンスを向上させるために、さまざまなテクノロジも使用します。たとえば、複雑なクエリを実行する場合、AGG オペレータなどの再実行オペレータは実行のために DN ノードにプッシュダウンされます。プッシュダウン オペレーターが実行されると、データの局所性が考慮され、ネットワーク内のデータの送信オーバーヘッドを削減するために、計算が可能な限りローカルで実行されます。
質問がある場合、または主要な技術的なポイントに興味がある場合は、[Yunka Q&A] で GaussDB SQL エンジンの謎を明らかにし、相互に対話し、イベント投稿にメッセージを残してプレゼントを獲得することができます。専門家が回答します。 1 対 1 で質問でき、質問に対するインセンティブを受け取る機会もあります。
クリックしてフォローし、できるだけ早くHuawei Cloudの新しいテクノロジーについて学びましょう~
ライナスは、カーネル開発者がタブをスペースに置き換えることを阻止するために自ら問題を解決しました。 彼の父親はコードを書くことができる数少ないリーダーの 1 人であり、次男はオープンソース テクノロジー部門のディレクターであり、末息子は中核です。ファー ウェイ: 一般的に使用されている 5,000 のモバイル アプリケーションを変換するのに 1 年かかった Java はサードパーティの脆弱性が最も発生しやすい言語です。Hongmeng の父: オープンソースの Honmeng は唯一のアーキテクチャ上の革新です。中国の基本ソフトウェア分野で 馬化騰氏と周宏毅氏が握手「恨みを晴らす」 元マイクロソフト開発者:Windows 11のパフォーマンスは「ばかばかしいほど悪い」 老祥基がオープンソースであるのはコードではないが、その背後にある理由は Meta Llama 3 が正式にリリースされ、 大規模な組織再編が発表されました。