並列ヒントを使用すると、並列クエリ機能を有効にするかどうかを指定できます。 並列度 (DOP) 、並列にスキャンする必要のあるテーブル、および各演算子の並列実行モードを指定することもできます。 PolarDB for MySQL 8.0.1は、並列クエリ機能のPARALLEL
およびNO_PARALLEL
ヒントをサポートしています。 PolarDB for MySQL 8.0.2は、PARALLEL
、NO_PARALLEL
、PQ_DISTRIBUTE
、PQ_GROUPBY
、PQ_DISTINCT
、PQ_WINDOW
、PQ_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テーブルのデータ配布メソッドが指定されていることを示します。strategy1
とstrategy2
の両方が指定されている場合、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 (ストラテジー) */
次の表に、構成可能なパラメーターを示します。
パラメーター | 説明 |
戦略 | データ配布戦略。 有効な値:
|
例:
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_WINDOW
ヒントを使用して、ウィンドウ関数の実行モードを指定できます。
/* + PQ_WINDOW([window_name] ストラテジー) */
ウィンドウ名が指定されたヒントは、ウィンドウ名のないヒントよりも優先度が高くなります。
次の表に、構成可能なパラメーターを示します。
パラメーター | 説明 |
window_name | データ配布戦略が適用されるウィンドウ関数の名前。 このパラメーターを指定しない場合、データ配布方法はすべてのウィンドウ関数に適用されます。 |
戦略 | データ配布戦略。 有効な値:
|
例:
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 (ストラテジー) */
次の表に、構成可能なパラメーターを示します。
パラメーター | 説明 |
戦略 | データ配布戦略。 有効な値:
|
並列サブクエリ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);