すべてのプロダクト
Search
ドキュメントセンター

PolarDB:クエリexecutorの概要

最終更新日:May 27, 2024

このトピックでは、PolarDB-Xのクエリ実行者がプッシュダウンできないSQLクエリを実行する方法について説明します。

クエリexecutor

SQLクエリ実行プログラムは、論理演算子を実行するために使用されるPolarDB-Xコンポーネントです。 ほとんどの場合、ポイントクエリはストレージ層のMySQLにプッシュダウンされ、実行されます。 PolarDB-Xは、単純なポイントクエリを処理するためにエグゼキュータを必要としません。 実行結果はデコードされ、再度エンコードされ、ユーザーに返されます。 ただし、一部の複雑なSQLクエリはMySQLにプッシュダウンできません。 PolarDB-Xは、これらのクエリを処理するためにexecutorを使用する必要があります。

SELECT l_orderkey, sum(l_extendedprice *(1 - l_discount)) AS収益
顧客、注文、LINEITEMから
c_mktsegment = 'AUTOMOBILE'
  とc_custkey = o_custkey
  とl_orderkey = o_orderkey
  およびo_orderdate <''1995-03-13'
  およびl_shipdate > '1995-03-13'
グループBY l_orderkey; 

次のEXPLAINステートメントを実行して、PolarDB-X実行プランに関する情報を照会できます。

HashAgg(group="l_orderkey", revenue="SUM(*)")
  HashJoin(condition="o_custkey = c_custkey", type="inner")
    収集 (concurrent=true)
      LogicalView(tables="ORDERS_[0-7],LINEITEM_[0-7]", shardCount=8, sql="SELECT 'ORDERS'.'o_custkey', 'LINEITEM'.'l_orderkey', ('LINEITEM'.'l_extendedprice' *? -'LINEITEM'.'l_discount') AS 'x' FROM 'ORDERS' AS 'ORDERS' INNER JOIN 'LINEITEM' AS 'LINEITEM' ON ((('ORDERS'.'o_orderkey' = 'LINEITEM'.'_) 'LINEIDE.'?'__(')' ('ORRRSDEIRDEIDEIDEIDEIDERS') ')'? '?'_(''__) ''
    収集 (concurrent=true)
      LogicalView(tables="CUSTOMER_[0-7]" 、shardCount=8、sql="SELECT 'c_custkey' FROM 'CUSTOMER' AS 'CUSTOMER' WHERE ('c_mktsegment' = ?)") 

LogicalViewのクエリはMySQLにプッシュダウンされ、実行されます。 プッシュダウンできないクエリは、PolarDB-Xの実行者によって実行されます。 次に、エグゼキュータは結果をユーザに返す。

実行モデル

従来のデータベースはVolcanoモデルを使用します。 ただし、PolarDB-Xは、PULLメソッドとPUSHメソッドを組み合わせたハイブリッドモデルを使用します。 PolarDB-Xは、データのキャッシュに一時テーブルが必要かどうかに基づいて、実行計画を複数のパイプラインに分割します。 パイプラインは、NEXT() メソッドを使用して、パイプライン内の計算を完了するためのデータを取得します。 パイプラインは、PUSHメソッドを使用して、計算結果を下流のパイプラインにプッシュします。 次の例では、実行計画は2つのパイプラインに分割されます。 パイプラインAはテーブルAをスキャンし、ハッシュテーブルを構築します。 パイプラインBはテーブルBをスキャンし、HASH JOINを使用してパイプラインAとテーブルBによってプッシュされたハッシュされたテーブルを結合し、結果をクライアントに返します。

実行モード

PolarDB-Xは次の実行モードをサポートします。

  • TP_LOCAL: クエリは、単一のノードで単一のスレッドを使用して処理されます。 TP_LOCALモードは、トランザクション処理に関連するクエリに適しています。これらのクエリには行数が少ないためです。 たとえば、このモードは、プライマリキーに基づくポイントクエリに適用できます。

  • AP_LOCAL: クエリは、単一ノードの複数のCPUコアを並行して使用して処理されます。 AP_LOCALモードは、読み取り専用インスタンスがない場合の分析処理に関連するクエリに適しています。 このモードは、並列クエリモードとも呼ばれます。

  • MPP: クエリは、読み取り専用インスタンスの異なるノード間で複数のCPUコアを並行して使用して処理されます。 このモードはクエリを高速化し、分析処理に関連するクエリに適しています。

PolarDB-Xには、実行プランの実行モードを照会するために使用できるEXPLAIN PHYSICALステートメントが導入されています。 次の例では、EXPLAIN PHYSICALステートメントの結果は、現在のクエリの実行モードがMPPであることを示しています。 結果は、各フラグメントの並列度も示す。

mysql> explain physical select a.k, count(*) cnt from sbtest1a, sbtest1bここでa.id = b.kおよびa.id > 1000 group by k hing cnt > 1300または
der by cnt limit 5, 10;
+ ------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| プラン |
+ ------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| ExecutorType: MPP |
| クエリのMaxConcurrentParallelism: 2 |
| フラグメント1 |
| シャッフル出力レイアウト: [BIGINT, BIGINT] 出力レイアウト: [BIGINT, BIGINT] |
| 出力パーティショニング: SINGLE [] Parallelism: 1 |
| TopN(sort="cnt ASC" 、offset=?2、fetch=?3) |
| フィルター (condition="cnt > ?1") |
| HashAgg(group="k", cnt="COUNT()") |
| BKAJoin(condition="k = id", type="inner") |
| RemoteSource(sourceFragmentIds=[0], type=RecordType(INTEGER_UNSIGNED id, INTEGER_UNSIGNED k)) |
| 収集 (同時=true) |
| LogicalView(tables="[000000-000003].sbtest1_[00-15]" 、shardCount=16、sql="SELECT 'k' FROM 'sbtest1' AS 'sbtest1' WHERE (('k' > ?)) AND ('k' IN (...)))) |
| フラグメント0 |
| シャッフル出力レイアウト: [BIGINT, BIGINT] 出力レイアウト: [BIGINT, BIGINT] |
| 出力パーティショニング: SINGLE [] Parallelism: 1 Splits: 16 |
| LogicalView(tables="[000000-000003].sbtest1_[00-15]", shardCount=16, sql="SELECT 'id', 'k' FROM 'sbtest1' AS 'sbtest1' WHERE ('id' > ?)") |
+ ------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 

HINT EXECUTOR_MODEを実行して、実行モードを指定できます。 たとえば、プライマリインスタンスに大量のアイドルリソースがある場合、実行モードをAP_LOCALまたはMPPに設定できます。 これにより、実行効率が向上する。

mysql> explain physical /* + TDDL:EXECUTOR_MODE=AP_LOCAL */select a.k、count(*) cnt from sbtest1a、sbtest1bここでa.id = b.kおよびa.id > 1000 group by k having cnt > 1300 order by cnt limit 5、10; |
+ ------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| ExecutorMode: AP_LOCAL |
| フラグメント0の依存関係: [] parallelism: 4 |
| BKAJoin(condition="k = id", type="inner") |
| 収集 (同時=true) |
| LogicalView(tables="[000000-000003].sbtest1_[00-15]", shardCount=16, sql="SELECT 'id', 'k' FROM 'sbtest1' AS 'sbtest1' WHERE ('id' > ?)") |
| 収集 (同時=true) |
| LogicalView(tables="[000000-000003].sbtest1_[00-15]" 、shardCount=16、sql="SELECT 'k' FROM 'sbtest1' AS 'sbtest1' WHERE (('k' > ?)) AND ('k' IN (...)))) |
| フラグメント1の依存関係: [] parallelism: 8 |
| LocalBuffer |
| RemoteSource(sourceFragmentIds=[0], type=RecordType(INTEGER_UNSIGNED id, INTEGER_UNSIGNED k, INTEGER_UNSIGNED k0)) |
| フラグメント2の依存関係: [0, 1] parallelism: 8 |
| フィルター (condition="cnt > ?1") |
| HashAgg(group="k", cnt="COUNT()") |
| RemoteSource(sourceFragmentIds=[1], type=RecordType(INTEGER_UNSIGNED id, INTEGER_UNSIGNED k, INTEGER_UNSIGNED k0)) |
| フラグメント3の依存関係: [0, 1] parallelism: 1 |
| LocalBuffer |
| RemoteSource(sourceFragmentIds=[2], type=RecordType(INTEGER_UNSIGNED k, BIGINT cnt)) |
| フラグメント4の依存関係: [2, 3] parallelism: 1 |
| TopN(sort="cnt ASC" 、offset=?2、fetch=?3) |
| RemoteSource(sourceFragmentIds=[3], type=RecordType(INTEGER_UNSIGNED k, BIGINT cnt)) |
+ ------------------------------------------------------------------------------------------------------------------------------------------------------------- + 

MPPモードの並列度は、物理テーブルでスキャンされた行数、インスタンスの仕様、および関係するテーブルシャードの数に基づいて計算されます。 システムは高い同時実行シナリオをサポートする必要があるため、ほとんどの場合、並列処理の程度が高くなります。 EXPLAIN PHYSICALを実行して、並列処理の程度を照会できます。 HINT MPP_PARALLELISMを実行して、並列処理の程度を指定できます。

/* + TDDL:EXECUTOR_MODE=MPP MPP_PARALLELISM=8 */select a.k, count(*) cnt from sbtest1a, sbtest1bここでa.id = b.kおよびa.id > 1000 group by k having cnt > 1300 order by cnt limit 5, 10;