产品概述
应用场景
产品架构
实例类型
兼容性说明

PARALLEL(num) -- Global级、Query Block级PARALLEL(@qbname num) -- Query Block级PARALLEL(tablename) -- Table 级PARALLEL(tablename num) -- Table 级NO_PARALLEL -- Global级、Query Block级NO_PARALLEL(@qbname) -- Query Block级NO_PARALLEL(tablename) -- Table 级
-- Global 级别EXPLAIN select /*+ PARALLEL(4) */ * from t1 where a > 4;-- Query block 级别,只在最顶层查询起作用EXPLAIN select /*+ QB_NAME(q1) PARALLEL(@q1 4) */ * from t1 where a > 4;-- Query block 级别,只在子查询中有效explain select * from t3 where a = (select /*+ PARALLEL(2) */ count(a) from t3);-- Table 级别EXPLAIN select /*+ PARALLEL(t1 4) */ from t1 where a > 4;-- Table 级别EXPLAIN select /*+ PARALLEL(t3@q2 4) */ * from t3 where a = (select /*+ QB_NAME(q2) */ count(a) from t3);-- Table 级别EXPLAIN select /*+ PARALLEL(@q2 t3 4) */ * from t3 where a = (select /*+ QB_NAME(q2) */ count(a) from t3);

-- 基本语法PQ_DISTRIBUTE(tablespec strategy1 strategy2)PQ_DISTRIBUTE(tablespec strategy)-- 针对特定操作类型PQ_DISTRIBUTE(target strategy1 strategy2)
target :操作目标,支持 AGGREGATE、SORT 和 WINDOW,分别指定 GROUP BY,ORDER BY, WINDOW 函数的分布策略,WINDOW 可以在后面指定 WINDOW 的名字。strategy1、strategy2:重分布的策略,支持 NONE、GATHER、HASH、BROADCAST。PQ_DISTRIBUTE(t1 HASH, HASH)、PQ_DISTRIBUTE(t1@qb1 HASH, HASH) 或PQ_DISTRIBUTE(@qb1 t1 HASH HASH):指定 t1 和它前一个表做 JOIN 时,先使用 HASH 重分布,再在各个节点上做 JOIN。PQ_DISTRIBUTE(t1 BROADCAST, NONE):指定 t1 和它前一个表做 JOIN 时,前一个也就是外表做 Broadcast,再和 t1 做 JOIN。PQ_DISTRIBUTE(t1 GATHER):指定 t1 表先做 Gather,再和其他表做 JOIN。-- 两个表都进行 HASH 重分布后 JOINSELECT /*+ PQ_DISTRIBUTE(t1 HASH, HASH) */ *FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id;-- 外表广播,内表不重分布SELECT /*+ PQ_DISTRIBUTE(t1 BROADCAST, NONE) */ *FROM small_table t1 JOIN large_table t2 ON t1.id = t2.id;-- 表数据收集到 Leader 后执行 JOINSELECT /*+ PQ_DISTRIBUTE(t1 GATHER) */ *FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id;
PQ_DISTRIBUTE(AGGREGATE NONE):完全下推一阶段。PQ_DISTRIBUTE(AGGREGATE NONE, GATHER):Worker 和 Leader 二阶段。PQ_DISTRIBUTE(AGGREGATE NONE HASH):Worker 和 Worker 二阶段。PQ_DISTRIBUTE(AGGREGATE GATHER):只在 Leader 上的一阶段。-- 完全下推的一阶段聚合SELECT /*+ PQ_DISTRIBUTE(AGGREGATE NONE) */department, AVG(salary)FROM employeesGROUP BY department;-- Worker 和 Leader 二阶段聚合SELECT /*+ PQ_DISTRIBUTE(AGGREGATE NONE, GATHER) */department, AVG(salary)FROM employeesGROUP BY department;-- Worker 和 Worker 二阶段聚合SELECT /*+ PQ_DISTRIBUTE(AGGREGATE NONE HASH) */department, AVG(salary)FROM employeesGROUP BY department;-- 只在 Leader 上执行的一阶段聚合SELECT /*+ PQ_DISTRIBUTE(AGGREGATE GATHER) */department, AVG(salary)FROM employeesGROUP BY department;
PQ_DISTRIBUTE(SORT NONE, GATHER):Worker + Leader 的 Merge Sort。PQ_DISTRIBUTE(SORT GATHER):只在 Leader 上做 Sort。-- Worker 局部排序 + Leader 归并排序SELECT /*+ PQ_DISTRIBUTE(SORT NONE, GATHER) */ *FROM large_tableORDER BY create_time DESC;-- 只在 Leader 上全局排序SELECT /*+ PQ_DISTRIBUTE(SORT GATHER) */ *FROM large_tableORDER BY create_time DESC;
-- 在 Leader 节点上计算全局排名SELECT /*+ PQ_DISTRIBUTE(WINDOW GATHER) */student_id,score,RANK() OVER (ORDER BY score DESC) as global_rankFROM exam_scores;-- 计算每个学生的成绩变化趋势(数据量较小)SELECT /*+ PQ_DISTRIBUTE(WINDOW GATHER) */student_id,exam_date,score,LAG(score) OVER (PARTITION BY student_id ORDER BY exam_date) as prev_scoreFROM student_scores;
-- 按学科分区并行计算排名SELECT /*+ PQ_DISTRIBUTE(WINDOW HASH) */subject,student_id,score,RANK() OVER (PARTITION BY subject ORDER BY score DESC) as subject_rankFROM exam_scores;-- 按部门分区计算工资累计总和SELECT /*+ PQ_DISTRIBUTE(WINDOW HASH) */department,employee_id,salary,SUM(salary) OVER (PARTITION BY department ORDER BY hire_date) as cumulative_salaryFROM employees;
-- 为特定命名的窗口使用GATHER策略SELECT /*+ PQ_DISTRIBUTE(WINDOW win1 GATHER) */student_id,subject,score,AVG(score) OVER win1 as avg_score,RANK() OVER (PARTITION BY subject ORDER BY score DESC) as rankFROM exam_scoresWINDOW win1 AS (PARTITION BY student_id);-- 多个命名窗口的不同策略SELECT /*+ PQ_DISTRIBUTE(WINDOW win1 GATHER) PQ_DISTRIBUTE(WINDOW win2 HASH) */department,employee_id,salary,AVG(salary) OVER win1 as dept_avg,SUM(salary) OVER win2 as running_totalFROM employeesWINDOW win1 AS (PARTITION BY department),win2 AS (PARTITION BY department ORDER BY hire_date);
-- 为特定窗口使用 HASH 分布SELECT /*+ PQ_DISTRIBUTE(WINDOW win1 HASH) */product_category,product_id,sales_amount,SUM(sales_amount) OVER win1 as category_total,RANK() OVER (ORDER BY sales_amount DESC) as global_rankFROM sales_dataWINDOW win1 AS (PARTITION BY product_category);-- 混合策略:一个窗口 GATHER,另一个窗口 HASHSELECT /*+ PQ_DISTRIBUTE(WINDOW win1 GATHER) PQ_DISTRIBUTE(WINDOW win2 HASH) */customer_id,order_date,amount,AVG(amount) OVER win1 as cust_avg, -- 小数据量用GATHERSUM(amount) OVER win2 as running_sum -- 大数据量用HASHFROM ordersWINDOW win1 AS (PARTITION BY customer_id),win2 AS (PARTITION BY customer_id ORDER BY order_date);
-- 指定这个 IN 子查询使用 MATERIALIZATION 策略并且在并行计划不使用预先执行策略EXPLAIN FORMAT=TREESELECT * FROM t1WHERE t1.a IN (SELECT /*+ SUBQUERY(MATERIALIZATION, PQ_INLINE_EVALUATION) */ aFROM t2);-- 指定 Derived Table 子查询 t 使用预先执行策略EXPLAIN FORMAT=TREESELECT /*+ NO_MERGE(t) pq_distribute(t1 none) */ t1.aFROM t1, (SELECT /*+ subquery(pq_inline_evaluation) */ aFROM t2) tWHERE t1.a = t.a;
文档反馈