日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

并行查詢Hint語法

Parallel Hints可以指定優化器是否選擇并行執行,還支持指定并行度以及需要并行的表,以及各個算子的并行執行方式。PolarDB MySQL版8.0.1版本目前支持在并行查詢中使用PARALLELNO_PARALLEL兩種Hints。PolarDB MySQL版8.0.2版本除了支持PARALLELNO_PARALLEL外,還增加了PQ_DISTRIBUTE hint來控制join的并行策略;通過PQ_GROUPBYPQ_DISTINCTPQ_WINDOWPQ_ORDERBY hint來控制各個分析型算子的并行執行方式。

開啟或關閉并行查詢

  • 開啟并行查詢

    您可以使用如下任意一種方式開啟并行查詢:

    • SELECT /*+PARALLEL(x)*/ ... FROM ...;   -- x >0
    • SELECT /*+ SET_VAR(max_parallel_degree=n) */  *  FROM ...   -- n > 0
  • 關閉并行查詢

    您可以使用如下任意一種方式關閉并行查詢:

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

通過Hint指定并行表

并行查詢提供了PARALLELNO_PARALLEL兩種Hint,可以指定允許哪些表并行掃描,不允許哪些表并行掃描。其中:

  • 通過PARALLEL Hint可以強制查詢并行執行,同時可以指定并行度和并行掃描的表。語法如下所示:

    /*+ PARALLEL [( [query_block] [table_name]  [degree] )] */
  • 通過NO_PARALLEL Hint可以強制查詢串行執行,或者指定不選擇某些表作為并行掃描的表。

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

其中參數說明如下所示

參數

說明

query_block

應用Hint的query block名稱。

table_name

應用Hint的表名稱。

degree

并行度。

示例:

SELECT /*+PARALLEL()*/ * FROM t1, t2; 
-- 當表記錄數小于records_threshold_for_parallelism設置的行數 ( 默認10000行)時,會強制并行,
-- 并行度用系統默認max_parallel_degree, 如果max_parallel_degree > 0, 
-- 則打開并行,如果max_parallel_degree等于0時,依舊時關閉并行。

SELECT /*+PARALLEL(8)*/ * FROM t1, t2; 
-- 強制并行度8并行執行, 
-- 當表記錄數小于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)*/ * FROM t1, t2; 
-- 選擇t1表并行, 對t1表執行/*+PARALLEL()*/ 語法

SELECT /*+PARALLEL(t1 8)*/ * FROM t1, t2; 
-- 強制并行度8且選擇t1表并行執行,  對t1表執行/*+PARALLEL(8)*/語法

SELECT /*+PARALLEL(@subq1)*/ SUM(t.a) FROM t WHERE t.a = 
  (SELECT /*+QB_NAME(subq1)*/ SUM(t1.a) FROM t1); 
--強制subquery并行執行, 并行度用系統默認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); 
--強制subquery并行執行, 并行度設置max_parallel_degree為8

SELECT SUM(t.a) FROM t WHERE t.a = 
  (SELECT /*+PARALLEL()*/ SUM(t1.a) FROM t1); 
--強制subquery并行執行, 
-- 并行度用系統默認max_parallel_degree, 
-- 如果max_parallel_degree > 0, 則打開并行,max_parallel_degree等于0時,依舊時關閉并行

SELECT SUM(t.a) FROM t WHERE t.a = 
  (SELECT /*+PARALLEL(8)*/ SUM(t1.a) FROM t1); 
--強制subquery并行執行, 設置并行度max_parallel_degree為8

SELECT /*+NO_PARALLEL()*/ * FROM t1, t2; 
-- 禁止并行執行

SELECT /*+NO_PARALLEL(t1)*/ * FROM 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); 
--禁止subquery并行執行

SELECT SUM(t.a) FROM t WHERE t.a = 
  (SELECT /*+NO_PARALLEL()*/ SUM(t1.a) FROM t1); 
 --禁止subquery并行執行
說明

對于不支持并行的查詢或者并行掃描的表,PARALLEL Hint不生效。

并行Join

通過PQ_DISTRIBUTE hint可以指定join操作以哪種方式來執行并行查詢。

  • 通過PQ_DISTRIBUTE指定某個表的數據分發方式:

    /*+ PQ_DISTRIBUTE([query_block] table_name  strategy ) */

    其中參數說明如下所示

    參數

    說明

    query_block

    應用Hint的query block名稱。

    table_name

    應用Hint的表名稱。

    strategy

    數據分發策略,包括:

    • PQ_GATHER:數據匯總到上層1個worker中。

    • PQ_HASH:數據shuffle分發到上層多個worker中。

    • PQ_BROADCAST: 數據廣播到上層多個worker中。

    • PQ_NONE:不做數據分發。

    示例:

    SELECT /*+ PARALLEL(t1) PQ_DISTRIBUTE(t1 PQ_GATHER) */ * FROM t as t1;
    -- 當表記錄數小于records_threshold_for_parallelism設置的行數( 默認10000行)時,會強制并行,
    -- 并行度用系統默認max_parallel_degree, 如果max_parallel_degree > 0,
    -- 則打開并行,如果max_parallel_degree等于0時,依舊關閉并行。
    -- 并行掃表后,不做數據分發,結果匯總到Leader
    SELECT /*+ PARALLEL(t1) PQ_DISTRIBUTE(t1 PQ_HASH) */t1.a, SUM(t1.b) * FROM t as t1 GROUP BY t1.a;
    -- 并行掃表后,將數據按照group by key分發到下層worker
  • 通過PQ_DISTRIBUTE指定兩表的join方式:

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

    以上hint如果只指定了strategy1,則相當于指定某個表的數據分發方式;如果同時指定了strategy1strategy2,則用來指定table_name表和其前面一張表的并行join方式。

    說明

    table_name前面的表可以是一張物理表,或者是前面join的中間結果表。

    示例:

    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表上做并行掃表,然后將數據做shuffle分發到下一階段Workers
    -- 在t2表上做并行掃表,然后將數據做shuffle分發到下一階段Workers
    -- 在下階段Workers上完成co-location join后,結果匯總到Leader
    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表上做并行掃表,然后將數據做匯總到Leader
    -- 在t2表上做并行掃表,然后將數據做匯總到Leader
    -- 在Leader上流水線收集數據,完成join操作

    對于不支持并行的查詢或者相互矛盾的hint,可能會導致查詢無法并行。示例如下:

    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表上做并行掃表,然后將數據分發到下一層多個Worker上
    -- 在t2表上做并行掃表,然后將數據做匯總到Leader
    -- 兩個hint在數據分布方式矛盾,會導致無法生成并行計劃

并行分組聚集

通過PQ_GROUPBY指定分組聚集的執行方式:

/*+ PQ_GROUPBY(strategy) */

其中參數說明如下所示:

參數

說明

strategy

數據分發策略,包括:

  • PQ_ONEPHASE:數據根據分組鍵分發到多個worker中,一次性并行完成分組聚集操作。

  • PQ_TWOPHASE_GATHER:數據在現有worker中完成局部聚集,再匯總到Leader上完成最終匯總。

  • PQ_TWOPHASE_HASH:數據在現有worker中完成局部聚集,再根據分組鍵分發到下階段多個worker中。

  • 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列分發到下一層多個Worker上
-- 在下一階段多個Worker中完成聚集計算,結果匯總到Leader

SELECT /*+ PARALLEL(t1) PQ_GROUPBY(PQ_TWOPHASE_HASH) */ t1.a, sum(t1.b) FROM t as t1 GROUP BY t1.a;
-- 在t1表上做并行掃表,然后直接在掃表的Workers上,完成一階段的聚集操作
-- 將中間聚集結果按照t1.a列分發到下一層多個Worker上
-- 在下一階段多個Worker中完成最終聚集計算,結果匯總到Leader

并行DISTINCT

通過PQ_DISTINCT指定分組聚集的執行方式:

/*+ PQ_DISTINCT(strategy) */

其中參數說明如下所示:

參數

說明

strategy

數據分發策略,包括:

  • PQ_TWOPHASE_GATHER:數據在現有worker中完成局部去重,再匯總到Leader上完成最終去重。

  • PQ_SERIAL:串行完成分組聚集。

并行窗口函數

通過PQ_WINDOW指定窗口函數的執行方式:

/*+ PQ_WINDOW([window_name] strategy) */
說明

帶窗口名稱hint的優先級高于沒有名稱的hint。

其中參數說明如下所示:

參數

說明

window_name

窗口函數名稱。指定策略對哪個窗口函數生效。如果不設置,默認對所有窗口函數生效。

strategy

數據分發策略,包括:

  • PQ_ONEPHASE:基于Partition by子句做數據分發,然后在Workers上并行完成窗口計算。

  • PQ_SERIAL:串行完成分組聚集。

示例:

SELECT /*+ PQ_WINDOW(PQ_ONEPHASE)  PQ_WINDOW(win PQ_SERIAL) */
  ROW_NUMBER() OVER(win) AS 'row_number',
  RANK() over(partition by name order by salary desc)
FROM employee_salaries WINDOW win as (partition by dept order by salary desc);
-- 對于名稱為win的窗口函數,通過串行方式計算
-- 對于其他窗口函數,通過在partition by key上分布做并行計算

并行Order by

通過PQ_ORDERBY指定排序操作的執行方式:

/*+ PQ_ORDERBY(strategy) */

其中參數說明如下所示:

參數

說明

strategy

數據分發策略,包括:

  • PQ_TWOPHASE_GATHER:數據在現有worker中完成局部排序,再匯總到Leader上完成最終排序。

  • PQ_SERIAL:串行完成排序。

并行子查詢

并行子查詢的選擇方式(并行子查詢詳細信息請參見子查詢支持)也可以通過Hint來進行控制,語法及說明如下:

/*+ PQ_PUSHDOWN [( [query_block])] */      #對應的子查詢會選擇push down的并行子查詢執行策略。
/*+ NO_PQ_PUSHDOWN [( [query_block])] */   #對應的子查詢會選擇shared access的并行子查詢執行策略。

示例:

#子查詢選擇push down并行策略
EXPLAIN SELECT /*+ PQ_PUSHDOWN(@qb1) */ * FROM t2 WHERE t2.a =
                 (SELECT /*+ qb_name(qb1) */ a FROM t1);

#子查詢選擇shared access并行策略
EXPLAIN SELECT /*+ NO_PQ_PUSHDOWN(@qb1) */ * FROM t2 WHERE t2.a =
                 (SELECT /*+ qb_name(qb1) */ a FROM t1);
#不加query block進行控制
EXPLAIN SELECT * FROM t2 WHERE t2.a =
                 (SELECT /*+ NO_PQ_PUSHDOWN() */ a FROM t1);