OceanBase 與并行執(zhí)行相關(guān)的 Hint

2021-06-17 17:13 更新

PARALLEL Hint

?PARALLEL? Hint 是語(yǔ)句級(jí)的 Hint,用來(lái)指示優(yōu)化器指定并行操作可使用的并行線程的數(shù)量。此 Hint 將覆蓋初始化參數(shù) ?PARALLEL_DEGREE_ POLICY? 的值。該 Hint 適用于語(yǔ)句的 ?SELECT?、?INSERT?、?MERGE?、?UPDATE? 和 ?DELETE? 部分,以及表掃描的部分。如果違反了任何的并行限制,則 ?PARALLEL? Hint 被忽略。

以下是 ?PARALLEL? Hint 的語(yǔ)法:

/*+ PARALLEL(integer) */
注意 
如果還進(jìn)行了排序或分組操作,那么可以使用的線程數(shù)量是 ?PARALLEL? Hint 中的值的兩倍。

?PARALLE ?Hint 中參數(shù) integer 的值用來(lái)指定并行度。

以下示例中,指定數(shù)據(jù)庫(kù)的并行度為 5:

SELECT /*+ PARALLEL(5) */ last_name
  FROM employees;

USE_PX Hint

?USE_PX? Hint 強(qiáng)制指示服務(wù)器在執(zhí)行 SQL 語(yǔ)句時(shí)使用 PX 模式,PX 模式允許在執(zhí)行語(yǔ)句時(shí)采用多線程方式。一般 ?USE_PX? Hint 和 ?PARALLEL? Hint 配合使用。

以下是 ?USE_PX? Hint 的語(yǔ)法:

/*+ USE_PX  */

示例如下:

SELECT /*+ USE_PX PARALLEL(4)*/ e.department_id, sum(e.salary)
 FROM employees e
 WHERE e.department_id = 1001;
 GROUP BY e.department_id;

NO_USE_PX Hint

?NO_USE_PX? Hint 強(qiáng)制指示服務(wù)器在執(zhí)行 SQL 語(yǔ)句時(shí)避免使用 PX 模式。

以下是 ?NO_USE_PX? Hint 的語(yǔ)法:

/*+ NO_USE_PX  */

示例如下:

SELECT /*+ NO_USE_PX*/ e.department_id, sum(e.salary)
 FROM employees e
 WHERE e.department_id = 1001;
 GROUP BY e.department_id;

PQ_DISTRIBUTE Hint

?PQ_DISTRIBUTE? Hint 指示優(yōu)化器怎樣在程序(查詢)服務(wù)器和消耗(負(fù)載)查詢服務(wù)器之間分配行。您可以通過(guò)該 Hint 控制聯(lián)接或負(fù)載的行分布?PQ_DISTRIBUTE? Hint 的語(yǔ)法:

/*+ PQ_DISTRIBUTE
  ( [ @ queryblock ] tablespec 
    { distribution | outer_distribution inner_distribution }
  ) */

控制負(fù)載的分配

您可以控制并行語(yǔ)句 ?INSERT ... SELECT? 和并行語(yǔ)句 ?CREATE TABLE ... AS SELECT? 的行分布,以此來(lái)確定如何在程序(查詢)服務(wù)器和消耗(負(fù)載)服務(wù)器之間進(jìn)行行分配。使用語(yǔ)法的上分支來(lái)指定分發(fā)方法。分布方法的值及其語(yǔ)義如下表所示:

分布方法

說(shuō)明

NONE

沒(méi)有分配。即將查詢和負(fù)載操作組合到每個(gè)查詢服務(wù)器中。所有服務(wù)器將加載所有分區(qū)。這種分配方法的缺失有助于避免在沒(méi)有偏離的情況下行分配的開(kāi)銷。由于空段或語(yǔ)句中的謂詞會(huì)過(guò)濾掉查詢?cè)u(píng)估的所有行,因此可能會(huì)發(fā)生偏離。如果由于使用此方法而發(fā)生偏斜,則請(qǐng)改用 RANDOM 或 RANDOM_ LOCAL 分布。

注意 

請(qǐng)謹(jǐn)慎使用此分配方法。每個(gè)進(jìn)程加載的 PGA 內(nèi)存最少需要 512 KB。如果還使用壓縮,則每臺(tái)服務(wù)器消耗大約 1.5 MB 的 PGA 內(nèi)存。

PARTITION

此方法使用 tablespec 的分區(qū)信息將行從查詢服務(wù)器分發(fā)到消耗服務(wù)器。當(dāng)不可能或不希望將查詢和加載操作組合在一起時(shí)和當(dāng)正在加載的分區(qū)數(shù)量大于或等于加載服務(wù)器的數(shù)量并且輸入數(shù)據(jù)將均勻地分布在正在加載的分區(qū)之間(即沒(méi)有偏離)時(shí),請(qǐng)使用此分步方法。

RANDOM

此方法以循環(huán)方式將來(lái)自程序的行分發(fā)給消耗。當(dāng)輸入數(shù)據(jù)高度傾斜時(shí),使用這種分布方法。

RANDOM_LOCAL

此方法將來(lái)自程序的行分布到一組服務(wù)器,這些服務(wù)器負(fù)責(zé)維護(hù)給定的一組服務(wù)器。兩個(gè)或多個(gè)服務(wù)器可以加載同一分區(qū),但是沒(méi)有服務(wù)器加載所有分區(qū)。當(dāng)輸入數(shù)據(jù)發(fā)生偏移并且由于內(nèi)存限制而無(wú)法合并查詢和加載操作時(shí),請(qǐng)使用此分布方法。

例如,在以下直接裝入插入操作中,該操作的查詢和負(fù)載部分被組合到每個(gè)查詢服務(wù)器中:

INSERT /*+ APPEND PARALLEL(target_table, 16) PQ_DISTRIBUTE(target_table, NONE) */
  INTO target_table
  SELECT * FROM source_table;

在下面的示例中,創(chuàng)建表時(shí)優(yōu)化器使用表 target_table 的分區(qū)來(lái)分配行:

CREATE /*+ PQ_DISTRIBUTE(target_table, PARTITION) */ TABLE target_table
  NOLOGGING PARALLEL 16
  PARTITION BY HASH (l_orderkey) PARTITIONS 512
  AS SELECT * FROM source_table;

控制聯(lián)接的分配

您可以通過(guò)指定兩種分配方法來(lái)控制聯(lián)接的分配方法,如語(yǔ)法中的下部分支所示,一種外部表的分布方法,一種內(nèi)部表的分布方法:

  • ?outside_distribution? 是外部表的分布方法。
  • ?inner_distribution? 是內(nèi)部表的分布方法。

分布方法的值是 ?HASH?、?BROADCAST?、?PARTITION? 和 ?NONE?。只有下表中的 6 種分布方法組合是有效的:

分布方法

說(shuō)明

HASH, HASH

使用聯(lián)接鍵上的哈希函數(shù),將每個(gè)表的行映射到消耗查詢服務(wù)器。映射完成后,每個(gè)查詢服務(wù)器都會(huì)在一對(duì)結(jié)果分區(qū)之間執(zhí)行聯(lián)接。當(dāng)表的大小可比較并且聯(lián)接操作是通過(guò)哈希聯(lián)接或排序合并聯(lián)接實(shí)現(xiàn)時(shí),建議使用此分布方法。

BROADCAST, NONE

外部表的所有行都廣播到每個(gè)程序查詢服務(wù)器。內(nèi)部表行是隨機(jī)分區(qū)的。當(dāng)外部表與內(nèi)部表相比非常小時(shí),建議使用此分布方法。通常,當(dāng)內(nèi)部表大小乘以查詢服務(wù)器的數(shù)量大于外部表大小時(shí),也建議使用此分布方法。

NONE, BROADCAST

內(nèi)部表的所有行都廣播給每個(gè)消耗查詢服務(wù)器。外部表行是隨機(jī)分區(qū)的。當(dāng)內(nèi)部表與外部表相比非常小時(shí),建議使用此分布方法。通常,當(dāng)內(nèi)部表大小乘以查詢服務(wù)器的數(shù)量小于外部表大小時(shí),也建議使用此分布方法。

PARTITION, NONE

外部表的行使用以內(nèi)部表的分區(qū)進(jìn)行映射。內(nèi)部表必須在聯(lián)接鍵上進(jìn)行分區(qū)。當(dāng)外部表的分區(qū)數(shù)等于或幾乎等于查詢服務(wù)器數(shù)的倍數(shù)時(shí),建議使用此分布方法。例如,有 14 個(gè)分區(qū)和 15 個(gè)查詢服務(wù)器。

注意 

如果內(nèi)部表未分區(qū)或未在分區(qū)鍵上等分聯(lián)接時(shí),則優(yōu)化器將忽略此 Hint。

NONE, PARTITION

內(nèi)部表的行使用外部表的分區(qū)進(jìn)行映射。外部表必須在聯(lián)接鍵上進(jìn)行分區(qū)。當(dāng)外部表的分區(qū)數(shù)等于或幾乎等于查詢服務(wù)器數(shù)的倍數(shù)時(shí),建議使用此分布方法。例如,有 14 個(gè)分區(qū)和 15 個(gè)查詢服務(wù)器。

注意 

如果外部表未在分區(qū)鍵上進(jìn)行分區(qū)或未等分聯(lián)時(shí)接,則優(yōu)化器將忽略此 Hint

NONE, NONE

每個(gè)查詢服務(wù)器在一對(duì)匹配的分區(qū)之間執(zhí)行聯(lián)接操作,每個(gè)表中都有一個(gè)。兩個(gè)表必須在連接鍵上等分。

例如,給定兩個(gè)使用哈希聯(lián)接來(lái)聯(lián)接表 r 和 s,以下查詢包含使用哈希分配的 Hint:

SELECT /*+ORDERED PQ_DISTRIBUTE(s HASH, HASH) USE_HASH (s)*/ column_list
  FROM r,s
  WHERE r.c=s.c;

要廣播外部表 r,查詢語(yǔ)句為:

SELECT /*+ORDERED PQ_DISTRIBUTE(s BROADCAST, NONE) USE_HASH (s) */ column_list
  FROM r,s
  WHERE r.c=s.c;
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)