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

PolarDB:実行プラン管理

最終更新日:May 24, 2024

このトピックでは、実行計画を管理および最適化する方法について説明します。

オプティマイザは、SQL文ごとに実行プランを生成します。 ほとんどの場合、クライアントアプリケーションからデータベースへのリクエストは、パラメーター値が異なる同じステートメントで構成されます。 これらのステートメントがパラメータ化されている場合、ステートメントは同じです。 次に、パラメーター化されたSQLクエリに基づいてキャッシュを作成し、実行計画やパラメーターを除くその他の情報をキャッシュできます。 このキャッシュはプランキャッシュと呼ばれます。

プランキャッシュは、バージョン更新全体の複雑なクエリの安定性を確保するために使用されます。 複雑なクエリは、複数のJOIN操作を伴うクエリを含む。 これは、SQLクエリの実行プランをプランキャッシュに永続的に格納することによって行われます。これにより、バージョンの更新中に実行プランが保持されます。 このプロセスは実行計画管理と呼ばれます。PolarDB-X

ワークフロー

PolarDB-Xでステートメントを実行すると、ステートメントは次の手順に基づいて処理されます。

  1. SQLステートメントは、すべてのパラメーターをプレースホルダー文字 (?) で置き換えることによってパラメーター化されます。

  2. パラメータ化されたSQL文は、SQL文の実行計画が計画キャッシュにキャッシュされているかどうかを確認するためのキーとして使用されます。 実行プランがキャッシュされていない場合、オプティマイザは最適化のために取り消されます。

  3. 簡易文は直接実行され、実行計画管理は行われません。

  4. 複雑なステートメントは、ベースラインに格納されている固定実行計画に基づいて実行されます。 複数の実行プランが利用可能な場合、最もコストの低い実行プランが選択されます。

キャッシュを計画する

デフォルトでは、プランキャッシュ機能はPolarDB-Xで有効になっています。 EXPLAINステートメントを実行して、SQLステートメントの実行計画を表示できます。 返された結果で、HitCacheはSQL文がプランキャッシュにヒットするかどうかを示します。 プランキャッシュ機能を有効にすると、PolarDB-Xは各SQLステートメントをパラメーター化して、SQLステートメント内のすべての定数をプレースホルダー文字 (?) に置き換え、パラメーターのリストを作成します。 実行計画では、LogicalView演算子のSQL文にプレースホルダー文字 (?) が含まれていることがわかります。

実行プラン管理

複雑なSQL文がプランキャッシュ機能によって処理された後、SQL文は実行プラン管理プロセスの対象となります。

プランキャッシュおよび実行プラン管理は、パラメータ化されたSQLステートメントをキーとして使用して、実行プランを選択する。 すべてのSQL文の実行計画は、計画キャッシュにキャッシュされます。 実行計画管理では、複雑なSQL文のみが処理されます。 1つ以上の最適化された実行プランは、パラメータが異なるため、SQLステートメントごとに提供されます。

実行計画管理では、各SQL文は1つのベースラインに対応し、各ベースラインには1つ以上の実行計画が含まれます。 各実行プランのコストは、SQL文で使用されるパラメーターに基づいて推定され、コストが最も低い実行プランが選択されます。 プランキャッシュ内の実行プランが実行プラン管理のために提供されると、SQLプラン管理 (SPM) は、実行プランが既知であるかどうかをチェックするプロセスを開始する。 実行プランが既知である場合、SPMは、実行プランが最も低いコストを被るかどうかをチェックする。 実行プランが未知である場合、SPMは、実行プランを実行する必要があるかどうかをチェックして、実行プランを最適化する必要があるかどうかを判定する。

O&Mの実行手順

PolarDB-Xは、実行計画を管理するためのさまざまなコマンドを提供します。 次の構文が使用されます。

ベースライン (LOAD | PERSIST | CLEAR | VALIDATE | LIST | DELETE) [署名整数、署名整数...]
ベースライン (ADD | FIX) SQL (HINT Select Statemtnt) 
  • BASELINE (ADD | FIX) SQL <HINT> <Select Statement>: ヒントによって修正された実行プランを固定実行プランとして格納する。

  • BASELINE LOAD: システムテーブルの指定されたベースライン情報をメモリに更新し、ベースライン情報を有効にします。

  • BASELINE LOAD_PLAN: システムテーブルの指定された実行プラン情報をメモリに更新して有効にします。

  • ベースラインリスト: すべてのベースラインに関する情報を一覧表示します。

  • BASELINE PERSIST: 指定されたベースラインをディスクにフラッシュします。

  • BASELINE PERSIST_PLAN: 指定された実行プランをディスクにフラッシュします。

  • BASELINE CLEAR: メモリからベースラインを削除します。

  • BASELINE CLEAR_PLAN: メモリから実行プランを削除します。

  • BASELINE DELETE: ディスクからベースラインを削除します。

  • BASELINE DELETE_PLAN: ディスクから実行プランを削除します。

実行計画を最適化するためのベストプラクティス

データが変更された後、またはPolarDB-Xのオプティマイザエンジンがアップグレードされた後、同じSQL文に対してより良い実行計画が利用可能になる場合があります。 自動プランの進化中、SPMには、SQL文のベースラインにあるplan Enumeratorによって自動的に検出されるより優れた実行プランが含まれます。 SPM命令を使用して、実行計画を最適化することもできます。

  1. EXPLAINステートメントが実行された後、返される結果は、SQLステートメントの実行プランがハッシュ結合を使用し、この実行プランのみがSQLステートメントのベースラインリストに含まれることを示します。

    EXPLAIN SELECT * FROM lineitem JOIN part ON l_partkey=p_partkey WHERE p_name LIKE '% green %';

    実行プランに関する次の情報が返されます。

    + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
    | ローカルプラン |
    + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
    | 収集 (parallel=true) |
    | ParallelHashJoin(condition="l_partkey = p_partkey", type="inner") |
    | LogicalView(tables="[00-03].lineitem" 、shardCount=4、sql="SELECT 'l_orderkey' 、'l_partkey' 、'l_suppkey' 、'l_linumber' 、'l_quantity' 、'l_quantity' 、'l_dateat' 、'__shiplinitl' 、' 、'_' 、'_' 、'、' 、'__dateateditelligl' '_'_''L_shipmode', 'L_comment' FROM 'lineitem' AS 'lineitem'", parallel=true) |
    | LogicalView(tables="[00-03].part", shardCount=4, sql="SELECT 'p_partkey ', 'p_name', 'p_mfgr', 'p_brand', 'p_type ', 'p_size', 'p_container', 'p_container', 'part''parallel' '''''''''''''ne' '' '' '' '' '' '' '' ''
    | HitCache:true |
    | |
    | |
    + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
    セットの7行 (0.06秒) 

    次のSQL文を実行して、ベースラインを表示します。

    ベースラインリスト;

    次の情報が返されます。

    ------------ -------------------------------------------------------------------------------- ----------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
    | BASELINE_ID | PARAMETERIZED_SQL | PLAN_ID | EXTERNALIZED_PLAN | FIXED | 受け入れ |
    ------------ -------------------------------------------------------------------------------- ----------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------
    | -399023558 | SELECT *
    ラインアイテムから
        参加部分にl_partkey = p_partkey
    WHERE p_name LIKE? | -935671684 |
    収集 (parallel=true)
      ParallelHashJoin(condition="l_partkey = p_partkey", type="inner")
        LogicalView(tables="[00-03].lineitem" 、shardCount=4、sql="SELECT 'l_orderkey' 、'l_partkey' 、'l_suppkey' 、'l_linumber' 、'l_quantity' 、'l_quantit.' 、'l_dateat' 、'_reshiplinitl' 、'_' 、'_date' 、' 、'、'_dateategl' 、'_tax'_' '_'L_shipmode' 、'L_comment' FROM 'lineitem' AS 'lineitem'" 、parallel=true)
        LogicalView(tables="[00-03].part" 、shardCount=4、sql="SELECT 'p_partkey '、'p_name' 、'p_mfgr' 、'p_brand' 、'p_type' 、'p_size' 、'p_container' 、'p_container' 、'part''paral' 、'''ne' 'Hep'? '? 'Hep'Hher' 、'Hher' 'Hep' 'AS'
     | 0 | 1 |
    ------------ -------------------------------------------------------------------------------- ----------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------
    1行セット (0.02秒) 
  2. バッチキーアクセス結合 (BKA結合、ルックアップ結合とも呼ばれます) を使用した後、特定の条件でのSQLステートメントのパフォーマンスが向上した場合、PolarDB-Xが期待される実行計画を生成するためのヒントを提供することをお勧めします。 BKA結合で使用されるヒントの構文は、/* + TDDL:BKA_JOIN(lineitem, part)*/ です。 EXPLAIN [HINT] [SQL] を実行して、実行計画が期待値を満たしているかどうかを確認します。

    EXPLAIN /* + TDDL:bka_join(lineitem、part)*/ SELECT * FROM lineitem JOIN part ON l_partkey=p_partkey WHERE p_name LIKE '% green %';

    実行プランに関する次の情報が返されます。

    + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
    | ローカルプラン |
    + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
    | 収集 (parallel=true) |
    | ParallelBKAJoin(condition="l_partkey = p_partkey", type="inner") |
    | LogicalView(tables="[00-03].lineitem" 、shardCount=4、sql="SELECT 'l_orderkey' 、'l_partkey' 、'l_suppkey' 、'l_linumber' 、'l_quantity' 、'l_quantity' 、'l_dateat' 、'__shiplinitl' 、' 、'_' 、'_' 、'、' 、'__dateateditelligl' '_'_''L_shipmode', 'L_comment' FROM 'lineitem' AS 'lineitem'", parallel=true) |
    | 収集 (同時=true) |
    | LogicalView(tables="[00-03].part", shardCount=4, sql="SELECT 'p_partkey ', 'p_name', 'p_mfgr', 'p_brand', 'p_type', 'p_size', 'p_container', 'p_container', 'part''part''''''''''''''?' HE'-'-'? '? 'HE'
    | HitCache:false |
    | |
    | |
    + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
    セットの8行 (0.14秒) 

    ヒントが指定された後、BKA結合が結合アルゴリズムとして使用されます。 ベースラインは変更されません。 このSQL文を実行するたびに上記の実行計画を使用する場合は、実行計画をベースラインに追加する必要があります。

  3. 実行プラン管理のBASELINE ADDコマンドを使用して、SQL文の実行プランを追加できます。 この場合、SQL文のベースラインには2つの実行プランが同時に存在します。 Plan Enumeratorは、コストの低い実行プランを選択します。

    BASELINE ADD SQL /* + TDDL:bka_join(lineitem、part)*/ SELECT * FROM lineitem JOIN part ON l_partkey=p_partkey WHERE p_name LIKE '% green %';

    次の情報が返されます。

    + ------------ ----------
    | BASELINE_ID | STATUS |
    + ------------ + ---------
    | -399023558 | OK |
    + ------------ + ---------
    1行セット (0.09秒) 

    次のSQL文を実行して、ベースラインを表示します。

    ベースラインリスト;

    次の情報が返されます。

    ------------ -------------------------------------------------------------------------------- ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------
    | BASELINE_ID | PARAMETERIZED_SQL | PLAN_ID | EXTERNALIZED_PLAN | FIXED | 受け入れ |
    ------------ -------------------------------------------------------------------------------- ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------
    | -399023558 | SELECT *
    ラインアイテムから
        参加部分にl_partkey = p_partkey
    WHERE p_name LIKE? | -1024543942 |
    収集 (parallel=true)
      ParallelBKAJoin(condition="l_partkey = p_partkey", type="inner")
        LogicalView(tables="[00-03].lineitem" 、shardCount=4、sql="SELECT 'l_orderkey' 、'l_partkey' 、'l_suppkey' 、'l_linumber' 、'l_quantity' 、'l_quantit.' 、'l_dateat' 、'_reshiplinitl' 、'_' 、'_date' 、' 、'、'_dateategl' 、'_tax'_' '_'L_shipmode' 、'L_comment' FROM 'lineitem' AS 'lineitem'" 、parallel=true)
        収集 (concurrent=true)
          LogicalView(tables="[00-03].part", shardCount=4, sql="SELECT 'p_partkey ', 'p_name', 'p_mfgr', 'p_brand', 'p_type', 'p_size', 'p_container', 'p_container', 'p_part' ''-'(') 'part') '?'-'(') ', ') ') 'Hep'
     | 0 | 1 |
    | -399023558 | SELECT *
    ラインアイテムから
        参加部分にl_partkey = p_partkey
    WHERE p_name LIKE? | -935671684 |
    収集 (parallel=true)
      ParallelHashJoin(condition="l_partkey = p_partkey", type="inner")
        LogicalView(tables="[00-03].lineitem" 、shardCount=4、sql="SELECT 'l_orderkey' 、'l_partkey' 、'l_suppkey' 、'l_linumber' 、'l_quantity' 、'l_quantit.' 、'l_dateat' 、'_reshiplinitl' 、'_' 、'_date' 、' 、'、'_dateategl' 、'_tax'_' '_'L_shipmode' 、'L_comment' FROM 'lineitem' AS 'lineitem'" 、parallel=true)
        LogicalView(tables="[00-03].part" 、shardCount=4、sql="SELECT 'p_partkey '、'p_name' 、'p_mfgr' 、'p_brand' 、'p_type' 、'p_size' 、'p_container' 、'p_container' 、'part''paral' 、'''ne' 'Hep'? '? 'Hep'Hher' 、'Hher' 'Hep' 'AS'
                   | 0 | 1 |
    ------------ -------------------------------------------------------------------------------- ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------
    セットの2列 (0.03秒) 

    BASELINE LISTコマンドの上記の結果は、BKA_JOINに基づく実行計画がSQL文のベースラインに追加されたことを示しています。 このSQL文に対してEXPLAIN文を実行すると、それはp_name LIKE? SQL文のが変更されるPolarDB-Xは異なる実行プランを選択します。

  4. PolarDB-Xに常に上記の実行プランを使用させるには、BASELINE FIXコマンドを使用してPolarDB-Xに指定された実行プランを強制的に使用させます。

    BASELINE FIX SQL /* + TDDL:bka_join(lineitem、part)*/ SELECT * FROM lineitem JOIN part ON l_partkey=p_partkey WHERE p_name LIKE '% green %';

    次の情報が返されます。

    + ------------ ----------
    | BASELINE_ID | STATUS |
    + ------------ + ---------
    | -399023558 | OK |
    + ------------ + ---------
    セットの1列 (0.07秒)
    mysql> ベースラインリスト \G
    *************************** 1。 行 ***************************
          BASELINE_ID: -399023558
    PARAMETERIZED_SQL: SELECT *
    ラインアイテムから
        参加部分にl_partkey = p_partkey
    WHERE p_name LIKE?
              PLAN_ID: -1024543942
    EXTERNALIZED_PLAN:
    収集 (parallel=true)
      ParallelBKAJoin(condition="l_partkey = p_partkey", type="inner")
        LogicalView(tables="[00-03].lineitem" 、shardCount=4、sql="SELECT 'l_orderkey' 、'l_partkey' 、'l_suppkey' 、'l_linumber' 、'l_quantity' 、'l_quantit.' 、'l_dateat' 、'_reshiplinitl' 、'_' 、'_date' 、' 、'、'_dateategl' 、'_tax'_' '_'L_shipmode' 、'L_comment' FROM 'lineitem' AS 'lineitem'" 、parallel=true)
        収集 (concurrent=true)
          LogicalView(tables="[00-03].part", shardCount=4, sql="SELECT 'p_partkey ', 'p_name', 'p_mfgr', 'p_brand', 'p_type', 'p_size', 'p_container', 'p_container', 'p_part' ''-'(') 'part') '?'-'(') ', ') ') 'Hep'
                FIXED: 1
             受け入れ: 1
    *************************** 2. 行 ***************************
          BASELINE_ID: -399023558
    PARAMETERIZED_SQL: SELECT *
    ラインアイテムから
        参加部分にl_partkey = p_partkey
    WHERE p_name LIKE?
              PLAN_ID: -935671684
    EXTERNALIZED_PLAN:
    収集 (parallel=true)
      ParallelHashJoin(condition="l_partkey = p_partkey", type="inner")
        LogicalView(tables="[00-03].lineitem" 、shardCount=4、sql="SELECT 'l_orderkey' 、'l_partkey' 、'l_suppkey' 、'l_linumber' 、'l_quantity' 、'l_quantit.' 、'l_dateat' 、'_reshiplinitl' 、'_' 、'_date' 、' 、'、'_dateategl' 、'_tax'_' '_'L_shipmode' 、'L_comment' FROM 'lineitem' AS 'lineitem'" 、parallel=true)
        LogicalView(tables="[00-03].part" 、shardCount=4、sql="SELECT 'p_partkey '、'p_name' 、'p_mfgr' 、'p_brand' 、'p_type' 、'p_size' 、'p_container' 、'p_container' 、'part''paral' 、'''ne' 'Hep'? '? 'Hep'Hher' 、'Hher' 'Hep' 'AS'
                固定: 0
             受け入れ: 1
    セットの2列 (0.01秒) 
  5. EXPLAINステートメントを再度実行して、実行計画を表示します。

    EXPLAIN SELECT * FROM lineitem JOIN part ON l_partkey=p_partkey WHERE p_name LIKE '% green %';

    実行プランに関する次の情報が返されます。

    + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
    | ローカルプラン |
    + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
    | 収集 (parallel=true) |
    | ParallelBKAJoin(condition="l_partkey = p_partkey", type="inner") |
    | LogicalView(tables="[00-03].lineitem" 、shardCount=4、sql="SELECT 'l_orderkey' 、'l_partkey' 、'l_suppkey' 、'l_linumber' 、'l_quantity' 、'l_quantity' 、'l_dateat' 、'__shiplinitl' 、' 、'_' 、'_' 、'、' 、'__dateateditelligl' '_'_''L_shipmode', 'L_comment' FROM 'lineitem' AS 'lineitem'", parallel=true) |
    | 収集 (同時=true) |
    | LogicalView(tables="[00-03].part", shardCount=4, sql="SELECT 'p_partkey ', 'p_name', 'p_mfgr', 'p_brand', 'p_type', 'p_size', 'p_container', 'p_container', 'part''part''''''''''''''?' HE'-'-'? '? 'HE'
    | HitCache:true |
    + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
    セットの8行 (0.01秒) 

    BASELINE FIXコマンドが実行された後、BKA結合を含む実行プランのFIXEDの値は1になります。 このようにして, ヒントが追加されていなくても, 指定された条件に関係なく, 実行計画に基づいてこのSQL文に対してEXPLAIN文が実行されます。