文档首页/
云数据库 GaussDB/
特性指南(集中式_V2.0-8.x)/
分区表/
分区表查询优化/
Partition-wise Join/
非SMP场景下的Partition-wise Join
更新时间:2024-11-12 GMT+08:00
非SMP场景下的Partition-wise Join
在非SMP场景下,Partition-wise Join的路径是基于规则生成的,即只要符合条件,即可生成Partition-wise Join路径,而无需对比路径代价。其开关为GUC参数enable_partitionwise。
使用规格
非SMP场景下的Partition-wise Join的使用规格:
- 只支持一级RANGE分区。
- 支持Hash Join、Nestloop Join、Merge Join。
- 只支持Inner Join。
- 需要设置query_dop的值为1。
- 由于非SMP场景下的Partition-wise Join为规则选择,所以Partition-wise Join计划可能造成性能下降,需要用户自行决定是否启用。
示例
--创建Range分区表。
gaussdb=# CREATE TABLE range_part (
a integer,
b integer,
c integer
) PARTITION BY RANGE (a)
(
PARTITION range_part_p1 VALUES LESS THAN (10),
PARTITION range_part_p2 VALUES LESS THAN (20),
PARTITION range_part_p3 VALUES LESS THAN (30),
PARTITION range_part_p4 VALUES LESS THAN (40)
);
CREATE TABLE
--设置query_dop为1,关闭SMP。
gaussdb=# SET query_dop = 1;
SET
--关闭非SMP场景下的Partition-wise Join开关。
gaussdb=# SET enable_partitionwise = off;
SET
--查看非SMP场景下的非Partition-wise Join计划。
gaussdb=# EXPLAIN (COSTS OFF) SELECT * FROM range_part t1 INNER JOIN range_part t2 ON (t1.a = t2.a);
QUERY PLAN
---------------------------------------------------------
Hash Join
Hash Cond: (t1.a = t2.a)
-> Partition Iterator
Iterations: 4
-> Partitioned Seq Scan on range_part t1
Selected Partitions: 1..4
-> Hash
-> Partition Iterator
Iterations: 4
-> Partitioned Seq Scan on range_part t2
Selected Partitions: 1..4
(11 rows)
--打开非SMP场景下的Partition-wise Join开关。
gaussdb=# SET enable_partitionwise = on;
SET
--查看非SMP场景下的Partition-wise Join计划。从执行计划中可以看到,Partition Iterator算子被提到了Hash Join算子的上层。计算方式由原来的依次扫描完所有分区的数据之后再进行Join,改为了每次扫描一对分区,进行Join,再依次遍历下一个分区。
gaussdb=# EXPLAIN (COSTS OFF) SELECT * FROM range_part t1 INNER JOIN range_part t2 ON (t1.A = t2.A);
QUERY PLAN
---------------------------------------------------------------
Result
-> Partition Iterator
Iterations: 4
-> Hash Join
Hash Cond: (t1.a = t2.a)
-> Partitioned Seq Scan on range_part t1
Selected Partitions: 1..4
-> Hash
-> Partitioned Seq Scan on range_part t2
Selected Partitions: 1..4
(10 rows)
-- 删除分区表。
gaussdb=# DROP TABLE range_part;
父主题: Partition-wise Join