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

PolarDB:並列ヒント

最終更新日:May 31, 2024

並列ヒントを使用すると、並列クエリ機能を有効にするかどうかを指定できます。 並列度 (DOP) 、並列にスキャンする必要のあるテーブル、および各演算子の並列実行モードを指定することもできます。 PolarDB for MySQL 8.0.1は、並列クエリ機能のPARALLELおよびNO_PARALLELヒントをサポートしています。 PolarDB for MySQL 8.0.2は、PARALLELNO_PARALLELPQ_DISTRIBUTEPQ_GROUPBYPQ_DISTINCTPQ_WINDOWPQ_ORDERBYのヒントをサポートします。 PQ_DISTRIBUTEヒントは、共同操作の並列実行ポリシーを指定するために追加されます。 PQ_GROUPBY、PQ_DISTINCT、PQ_WINDOW、およびPQ_ORDERBYヒントは、各解析演算子の並列実行モードを指定するために使用されます。

並列クエリ機能の有効化または無効化

  • 並列クエリ機能の有効化

    次のいずれかのステートメントを実行して、並列クエリ機能を有効にできます。

    • SELECT /* + PARALLEL(x)*/ ... FROM ...; -- x >0 
    • SELECT /* + SET_VAR(max_parallel_degree=n) */ * FROM ... -- n > 0
  • 並列クエリ機能を無効にする

    次のいずれかのステートメントを実行して、並列クエリ機能を無効にできます。

    • SELECT /* + NO_PARALLEL()*/ ... から...; 
    • SELECT /* + SET_VAR(max_parallel_degree=0) */ * FROM...

ヒントを使用して、並列にスキャンする必要があるテーブルを指定する

並列クエリ機能は、parallelおよびNO_PARALLELヒントをサポートしています。 これらのヒントは、並列にスキャンする必要があるテーブルと、並列にスキャンする必要がないテーブルを指定します。

  • PARALLELヒントを使用して、並列クエリを適用し、DOPと並列にスキャンする必要があるテーブルを指定できます。 サンプル構文:

    /* + PARALLEL [( [query_block] [table_name] [degree] )] */
  • NO_PARALLELヒントを使用して、シーケンシャルクエリを適用したり、並列スキャンが禁止されているテーブルを指定したりできます。

    /* + NO_PARALLEL [( [query_block] [table_name][, table_name] )] */

次の表に、構成可能なパラメーターを示します。

パラメーター

説明

query_block

ヒントが適用されるクエリブロックの名前。

table_name

ヒントが適用されるテーブルの名前。

程度

DOPだ

例:

SELECT /* + PARALLEL()*/ * からt1、t2;
-- テーブル内の行数がrecords_threshold_for_parallelismの指定値未満の場合、並列クエリが強制的に実行されます。 records_threshold_for_parallelismのデフォルト値は10000です。 
− デフォルトパラメータmax_parallel_degreeは、DOPを指定するために使用される。 max_parallel_degreeが0より大きい値に設定されている場合、-- 並列クエリ機能が有効になっています。 max_parallel_degreeが0に設定されている場合、並列クエリ機能は無効になります。 

SELECT /* + PARALLEL(8)*/ * からt1、t2;
-- このステートメントは、DOP 8で並列クエリを強制します。  
-- テーブル内の行数がrecords_threshold_for_parallelismの指定値未満の場合、並列クエリが強制的に実行されます。 records_threshold_for_parallelismのデフォルト値は10000です。 
-max_parallel_degreeパラメーターは8に設定されます。 

SELECT /* + SET_VAR(max_parallel_degree=8) */ * FROM...
-max_parallel_degreeパラメーターは8に設定されます。  
-- テーブルの行数がrecords_threshold_for_parallelismの値より小さい場合 (20000など) 、並列クエリ機能は自動的に無効になります。 

SELECT /* + PARALLEL(t1)*/ * からt1、t2;
-- このステートメントは、テーブルの /* + parallel ()* /構文を使用して、t1テーブルに並列クエリを適用します。

SELECT /* + PARALLEL(t1 8)*/ * からt1、t2;
-- このステートメントは、テーブルの /* + parallel (8)* /構文を使用して、8のDOPでt1テーブルに並列クエリを強制します。

SELECT /* + PARALLEL(@ subq1)*/ SUM(t.a) FROM t WHERE t.a= 
  (SELECT /* + QB_NAME(subq1)*/ SUM(t1.a) FROM t1);
-- このステートメントは、並列サブクエリを強制します。 DOPを指定するには、デフォルトパラメーターmax_parallel_degreeを使用します。  
-max_parallel_degreeが0より大きい値に設定されている場合、並列クエリ機能が有効になります。 max_parallel_degreeが0に設定されている場合、並列クエリ機能は無効になります。

SELECT /* + PARALLEL(@ subq1 8)*/ SUM(t.a) FROM t WHERE t.a= 
  (SELECT /* + QB_NAME(subq1)*/ SUM(t1.a) FROM t1);
-- このステートメントは、並列サブクエリを強制します。 max_parallel_degreeパラメーターは8に設定されています。

SELECT SUM(t.a) FROM t WHERE t.a= 
  (SELECT /* + PARALLEL()*/ SUM(t1.a) FROM t1);
-- このステートメントは、並列サブクエリを強制します。  
− デフォルトパラメータmax_parallel_degreeは、DOPを指定するために使用される。  
-max_parallel_degreeが0より大きい値に設定されている場合、並列クエリ機能が有効になります。 max_parallel_degreeが0に設定されている場合、並列クエリ機能は無効になります。

SELECT SUM(t.a) FROM t WHERE t.a= 
  (SELECT /* + PARALLEL(8)*/ SUM(t1.a) からt1);
-- このステートメントは、並列サブクエリを強制します。 max_parallel_degreeパラメーターは8に設定されています。

SELECT /* + NO_PARALLEL()*/ * FROM t1, t2;
-- このステートメントは、並列クエリ機能を無効にします。

SELECT /* + NO_PARALLEL(t1)*/ * からt1、t2;
-- このステートメントは、t1テーブルのみの並列クエリを禁止します。 システムが並列クエリ機能を有効にする場合、システムは、並列スキャンを実行し、t2テーブルに対して並列クエリを実行することができる。

SELECT /* + NO_PARALLEL(t1, t2)*/ * FROM t1, t2;
-- このステートメントは、t1およびt2テーブルの並列クエリを禁止します。

SELECT /* + NO_PARALLEL(@ subq1)*/ SUM(t.a) FROM t WHERE t.a= 
  (SELECT /* + QB_NAME(subq1)*/ SUM(t1.a) FROM t1);
-- このステートメントは、並列サブクエリを禁止します。

SELECT SUM(t.a) FROM t WHERE t.a= 
  (SELECT /* + NO_PARALLEL()*/ SUM(t1.a) FROM t1); 
 -- このステートメントは、並列サブクエリを禁止します。
説明

PARALLELヒントは、並列処理をサポートしないクエリや、並列スキャンをサポートしないテーブルには効果がありません。

並列結合操作Parallel join operations

PQ_DISTRIBUTEヒントを使用して、結合操作の並列クエリ実行モードを指定できます。

  • PQ_DISTRIBUTEヒントを使用して、テーブルのデータ配布戦略を指定します。

    /* + PQ_DISTRIBUTE([query_block] table_nameストラテジー) */

    次の表に、構成可能なパラメーターを示します。

    パラメーター

    説明

    query_block

    ヒントが適用されるクエリブロックの名前。

    table_name

    ヒントが適用されるテーブルの名前。

    戦略

    データ配布戦略。 有効な値:

    • PQ_GATHER: 前フェーズのワーカーにデータを集約します。

    • PQ_HASH: データはシャッフルされ、前のフェーズの複数のワーカーに配布されます。

    • PQ_BROADCAST: 前のフェーズの複数のワーカーにデータがブロードキャストされます。

    • PQ_NONE: データは配信されません。

    例:

    SELECT /* + PARALLEL(t1) PQ_DISTRIBUTE(t1 PQ_GATHER) */ * tからt1;
    -- テーブル内の行数がrecords_threshold_for_parallelismの指定値未満の場合、並列クエリが強制的に実行されます。 records_threshold_for_parallelismのデフォルト値は10000です。 
    − デフォルトパラメータmax_parallel_degreeは、DOPを指定するために使用される。 max_parallel_degreeが0より大きい値に設定されている場合、-- 並列クエリ機能が有効になっています。 max_parallel_degreeが0に設定されている場合、並列クエリ機能は無効になります。 
    -テーブルが並列にスキャンされた後、データは配布されませんが、結果はリーダーによって収集されます。
    SELECT /* + PARALLEL(t1) PQ_DISTRIBUTE(t1 PQ_HASH) */t1.a、SUM(t1.b) * FROM t as t1 GROUP BY t1.a;
    -テーブルが並行してスキャンされた後、データはグループキーに基づいて次のフェーズのワーカーに配布されます。
  • PQ_DISTRIBUTEヒントを使用して、2つのテーブルの結合モードを指定します。

    /* + PQ_DISTRIBUTE([query_block] table_name strategy1 [strategy2]) */

    上記のステートメントで、strategy1のみが指定されている場合は、table_nameテーブルのデータ配布メソッドが指定されていることを示します。 strategy1strategy2の両方が指定されている場合、table_nameテーブルと前のテーブルの間の並列結合モードが指定されていることを示します。

    説明

    前のテーブルは、物理テーブルまたは前の結合操作の中間テーブルとすることができる。

    例:

    SELECT /* + PARALLEL(t1) PARALLEL(t2) PQ_DISTRIBUTE(t2 PQ_HASH PQ_HASH) */ * FROM t as t1 STRAIGHT_JOIN t as t2 on t1.b = t2.c;
    -- t1テーブルは並行してスキャンされ、データはシャッフルされ、次のフェーズのワーカーに配布されます。
    -- t2テーブルは並行してスキャンされ、データはシャッフルされ、次のフェーズのワーカーに配布されます。
    -次のフェーズのワーカーは、コロケーション結合を実行します。 次に、結果はリーダーによって収集されます。
    SELECT /* + PARALLEL(t1) PARALLEL(t2) PQ_DISTRIBUTE(t2 PQ_GATHER PQ_GATHER) */ * FROM t as t1 STRAIGHT_JOIN t as t2 on t1.b = t2.c;
    -- t1テーブルが並列にスキャンされ、データがリーダーに配布されます。
    -- t2テーブルが並列にスキャンされ、データがリーダーに配布されます。
    -- リーダーはデータを収集し、結合操作を完了します。

    クエリが並列処理をサポートしない場合、またはクエリが2つの競合するヒントを使用する場合、クエリは失敗する可能性があります。 サンプル構文:

    SELECT /* + PARALLEL(t1) PARALLEL(t2) PQ_DISTRIBUTE(t2 PQ_HASH PQ_GATHER) */ * FROM t as t1 STRAIGHT_JOIN t as t2 on t1.b = t2.c;
    -- t1テーブルは並列にスキャンされ、データは次のフェーズの複数のワーカーに配布されます。
    -- t2テーブルが並列にスキャンされ、データがリーダーに配布されます。
    -2つのヒントのデータ配信モードが競合するため、並列クエリプランを生成できません。

並列グループ集計: PQ_GROUPBY

PQ_GROUPBYヒントを使用して、グループごとの集計の実行モードを指定できます。

/* + PQ_GROUPBY (ストラテジー) */

次の表に、構成可能なパラメーターを示します。

パラメーター

説明

戦略

データ配布戦略。 有効な値:

  • PQ_ONEPHASE: データは、グループキーに基づいて複数のワーカーに分散され、グループごとの集計を同時に並行して完了します。

  • PQ_TWOPHASE_GATHER: 各ワーカーはデータ集約を個別に実行し、リーダーは部分的な結果をマージして最終結果を生成します。

  • PQ_TWOPHASE_HASH: 各ワーカーは個別にデータ集約を行い、グループ鍵に基づいて次のフェーズの複数のワーカーにデータを配布します。

  • PQ_SERIAL: グループ単位での集計がシリアルに行われます。

例:

SELECT /* + PARALLEL(t1) PQ_GROUPBY(PQ_ONEPHASE) */ t1.a、sum(t1.b) FROM t as t1 GROUP BY t1.a;
-- t1テーブルは並列にスキャンされ、データはt1.a列に基づいて次のフェーズの複数のワーカーに配布されます。
-次のフェーズの複数のワーカーが集計計算を完了します。 次に、結果はリーダーによって収集されます。

SELECT /* + PARALLEL(t1) PQ_GROUPBY(PQ_TWOPHASE_HASH) */ t1.a、sum(t1.b) FROM t as t1 GROUP BY t1.a;
-- Workerはt1テーブルを並行してスキャンし、データ集約を個別に実行します。
-- 中間集計結果は、t1.a列に基づいて次のフェーズの複数のワーカーに配布されます。
-次のフェーズの複数のワーカーが集計計算を完了します。 次に、結果はリーダーによって収集されます。

並列グループ集計: PQ_DISTINCT

PQ_DISTINCTヒントを使用して、グループごとの集計の実行モードを指定できます。

/* + PQ_DISTINCT (ストラテジー) */

次の表に、構成可能なパラメーターを示します。

パラメーター

説明

戦略

データ配布戦略。 有効な値:

  • PQ_TWOPHASE_GATHER: 各ワーカーはデータ集約を個別に実行し、リーダーは部分的な結果をマージして最終結果を生成します。

  • PQ_SERIAL: グループ単位での集計がシリアルに行われます。

並列ウィンドウ関数

PQ_WINDOWヒントを使用して、ウィンドウ関数の実行モードを指定できます。

/* + PQ_WINDOW([window_name] ストラテジー) */
説明

ウィンドウ名が指定されたヒントは、ウィンドウ名のないヒントよりも優先度が高くなります。

次の表に、構成可能なパラメーターを示します。

パラメーター

説明

window_name

データ配布戦略が適用されるウィンドウ関数の名前。 このパラメーターを指定しない場合、データ配布方法はすべてのウィンドウ関数に適用されます。

戦略

データ配布戦略。 有効な値:

  • PQ_ONEPHASE: PARTITION by句を使用してデータを分散し、ウィンドウ関数を呼び出して複数のワーカーで計算を並列に実行します。

  • PQ_SERIAL: グループ単位での集計がシリアルに行われます。

例:

SELECT /* + PQ_WINDOW(PQ_ONEPHASE) PQ_WINDOW(win PQ_SERIAL) * /
  ROW_NUMBER() OVER(win) AS 'row_number' 、
  RANK() over (給与による名前順のパーティション) desc
employee_salariesからWINDOWが勝ちます (給与descによる部門別注文によるパーティション) 。-- winという名前のウィンドウ関数は、計算をシリアルに実行するために呼び出されます。
-- 他のウィンドウ関数の場合、並列計算のPARTITION BY句で指定されたキーに基づいて、データが複数のワーカーに分散されます。

並列データの並べ替え

PQ_ORDERBYヒントを使用して、データの並べ替えモードを指定できます。

/* + PQ_ORDERBY (ストラテジー) */

次の表に、構成可能なパラメーターを示します。

パラメーター

説明

戦略

データ配布戦略。 有効な値:

  • PQ_TWOPHASE_GATHER: ワーカーはデータを並列にソートし、リーダーは部分的な結果をマージして最終的なソート結果を生成します。

  • PQ_SERIAL: データはシリアルにソートされます。

並列サブクエリParallel subqueries

ヒントを使用して、並列サブクエリを実行するポリシーを指定できます。 詳細については、「並列クエリ実行プランの表示」のサブクエリのサポートをご参照ください。 サンプル構文:

/* + PQ_PUSHDOWN [( [query_block])] */ # サブクエリは、プッシュダウンポリシーに基づいて並列に実行されます。 
/* + NO_PQ_PUSHDOWN [( [query_block])] */ # サブクエリは、共有アクセスポリシーに基づいて並列に実行されます。

例:

# サブクエリは、プッシュダウンポリシーに基づいて並列に実行されます。
EXPLAIN SELECT /* + PQ_PUSHDOWN(@ qb1) */ * FROM t2 WHERE t2.a=
                 (SELECT /* + qb_name(qb1) */ a FROM t1);

# サブクエリは、共有アクセスポリシーに基づいて並行して実行されます。
EXPLAIN SELECT /* + NO_PQ_PUSHDOWN(@ qb1) */ * FROM t2 WHERE t2.a=
                 (SELECT /* + qb_name(qb1) */ a FROM t1);
# クエリブロックにヒントは追加されません。
EXPLAIN SELECT * FROM t2 WHERE t2.a=
                 (SELECT /* + NO_PQ_PUSHDOWN() */ a FROM t1);