W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
分布式執(zhí)行計劃可以使用 HINT 管理,以提高 SQL 查詢性能。
分布式執(zhí)行框架支持的 HINT 包括 ORDERED、LEADING、USE_NL、USE_HASH 和 USE_MERGE 等。
如果某個 query 確定不希望走并行執(zhí)行框架,使用 NO_USE_PX 拉回數(shù)據(jù)并生成本地執(zhí)行計劃。
指定分布式執(zhí)行的并行度。啟用 3 個 worker 并行執(zhí)行掃描,如下例所示:
obclient>SELECT /*+ PARALLEL(3) */ MAX(L_QUANTITY) FROM table_name;
注意
在復雜查詢中,調(diào)度器可以調(diào)度 2 個 DFO 并行流水執(zhí)行,此時,啟用的 worker 數(shù)量為并行度的2倍,即 PARALLEL * 2。
ORDERED HINT 指定并行查詢計劃中 JOIN 的順序,嚴格按照 FROM 語句中的順序生成。
如下例所示,強制要求 CUSTOMER 為左表,ORDERS 為右表,并且使用 NESTED LOOP JOIN:
obclient>CREATE TABLE lineitem(
l_orderkey NUMBER(20) NOT NULL ,
l_linenumber NUMBER(20) NOT NULL ,
l_quantity NUMBER(20) NOT NULL ,
l_extendedprice DECIMAL(10,2) NOT NULL ,
l_discount DECIMAL(10,2) NOT NULL ,
l_tax DECIMAL(10,2) NOT NULL ,
l_shipdate DATE NOT NULL,
PRIMARY KEY(L_ORDERKEY, L_LINENUMBER));
Query OK, 1 row affected (0.00 sec)
obclient>CREATE TABLE customer(
c_custkey NUMBER(20) NOT NULL ,
c_name VARCHAR(25) DEFAULT NULL,
c_address VARCHAR(40) DEFAULT NULL,
c_nationkey NUMBER(20) DEFAULT NULL,
c_phone CHAR(15) DEFAULT NULL,
c_acctbal DECIMAL(10,2) DEFAULT NULL,
c_mktsegment CHAR(10) DEFAULT NULL,
c_comment VARCHAR(117) DEFAULT NULL,
PRIMARY KEY(c_custkey));
Query OK, 1 row affected (0.00 sec)
obclient>CREATE TABLE orders(
o_orderkey NUMBER(20) NOT NULL ,
o_custkey NUMBER(20) NOT NULL ,
o_orderstatus CHAR(1) DEFAULT NULL,
o_totalprice DECIMAL(10,2) DEFAULT NULL,
o_orderdate DATE NOT NULL,
o_orderpriority CHAR(15) DEFAULT NULL,
o_clerk CHAR(15) DEFAULT NULL,
o_shippriority NUMBER(20) DEFAULT NULL,
o_comment VARCHAR(79) DEFAULT NULL,
PRIMARY KEY(o_orderkey,o_orderdate,o_custkey));
Query OK, 1 row affected (0.00 sec)
obclient> INSERT INTO lineitem VALUES(1,2,3,6.00,0.20,0.01,'01-JUN-02');
Query OK, 1 row affected (0.01 sec)
obclient> INSERT INTO customer VALUES(1,'Leo',null,null,'13700461258',null,'BUILDING',null);
Query OK, 1 row affected (0.01 sec)
obclient> INSERT INTO orders VALUES(1,1,null,null,'01-JUN-20',10,null,8,null);
Query OK, 1 row affected (0.00 sec)
obclient>SELECT /*+ ORDERED USE_NL(orders) */o_orderdate, o_shippriority
FROM customer, orders WHERE c_mktsegment = 'BUILDING' AND
c_custkey = o_custkey GROUP BY o_orderdate, o_shippriority;
+-------------+----------------+
| O_ORDERDATE | O_SHIPPRIORITY |
+-------------+----------------+
| 01-JUN-20 | 8 |
+-------------+----------------+
1 row in set (0.01 sec)
在手寫 SQL 時,ORDERED 較為有用,用戶知道 JOIN 的最佳順序時,可以將表按照順序?qū)懺?FROM 的后面,然后加上 ORDERED HINT。
LEADING HINT 指定并行查詢計劃中最先 JOIN 哪些表,LEADING 中的表從左到右的順序,也是 JOIN 的順序。它比 ORDERED 有更大的靈活性。
注意
如果 ORDERED 和 LEADING 同時使用,僅 ORDERED 生效。
PQ HINT 即 PQ_DISTRIBUTE
,用于指定并行查詢計劃中的數(shù)據(jù)分布方式。PQ HINT 會改變分布式 JOIN 時的數(shù)據(jù)分發(fā)方式。
PQ HINT 的基本語法如下:
PQ_DISTRIBUTE(tablespec outer_distribution inner_distribution)
參數(shù)解釋如下:
tablespec 指定關注的表,關注 JOIN 的右表。
outer_distribution 指定左表的數(shù)據(jù)分發(fā)方式。
inner_distribution 指定右表的數(shù)據(jù)分發(fā)方式。
兩表的數(shù)據(jù)分發(fā)方式共有以下六種:
HASH, HASH
BROADCAST, NONE
NONE, BROADCAST
PARTITION, NONE
NONE, PARTITION
NONE, NONE
其中,帶分區(qū)的兩種分發(fā)方式要求左表或右表有分區(qū),而且分區(qū)鍵就是 JOIN 的鍵。如果不滿足要求的話,PQ HINT 不會生效。
obclient>CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT, c4 DATE);
Query OK, 0 rows affected (0.09 sec)
obclient>CREATE INDEX i1 ON t1(c3);
Query OK, 0 rows affected (0.09 sec)
obclient>CREATE TABLE t2(c1 INT(11) NOT NULL, c2 INT(11) NOT NULL, c3 INT(11)
NOT NULL,
PRIMARY KEY (c1, c2, c3)) PARTITION BY KEY(c2) PARTITIONS 4;
Query OK, 0 rows affected (0.09 sec)
obclient>EXPLAIN BASIC SELECT /*+USE_PX PARALLEL(3) PQ_DISTRIBUTE
(t2 BROADCAST NONE) LEADING(t1 t2)*/ * FROM t1 JOIN t2 ON
t1.c2 = t2.c2\G;
*************************** 1. row ***************************
Query Plan:
================================================
|ID|OPERATOR |NAME |
------------------------------------------------
|0 |EXCHANGE IN DISTR | |
|1 | EXCHANGE OUT DISTR |:EX10001|
|2 | HASH JOIN | |
|3 | EXCHANGE IN DISTR | |
|4 | EXCHANGE OUT DISTR (BROADCAST)|:EX10000|
|5 | PX BLOCK ITERATOR | |
|6 | TABLE SCAN |t1 |
|7 | PX BLOCK ITERATOR | |
|8 | TABLE SCAN |t2 |
================================================
USE_NL HINT 指定 JOIN 使用 NESTED LOOP JOIN,并且需要滿足 USE_NL 中指定的表是 JOIN 的右表。
如下例所示,如果希望 join1 為 NESTED LOOP JOIN,則 HINT 寫為LEADING(a, (b,c)) USE_NL((b,c))
。
當 USE_NLJ 和 ORDERED、LEADING HINT 一起使用時,如果 USE_NLJ 中注明的表不是右表,則 USE_NLJ HINT 會被忽略。
USE_HASH HINT 指定 JOIN 使用 HASH JOIN,并且需要滿足 USE_HASH 中指定的表是 JOIN 的右表。
注意
如果沒有使用 ORDERED 和 LEADING HINT,并且優(yōu)化器生成的 JOIN 順序中指定的表之間不是直接 JOIN 的關系,那么 USE_HASH HINT 會被忽略。
USE_MERGE HINT 指定 JOIN 使用 MERGE JOIN,并且需要滿足 USE_MERGE 中指定的表是 JOIN 的右表。
注意
如果沒有使用 ORDERED 和 LEADING HINT,并且優(yōu)化器生成的 JOIN 順序中指定的表之間不是直接 JOIN 的關系,那么 USE_MERGE HINT 會被忽略。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: