返回首页

gbase数据、南大通用产品文档:GBase8a等值HASH 相关子查询优化

更新日期:2024年09月11日

说明
当查询所涉及的表存在Hash 分布的列,并且查询条件为该列等值查询,则可以
利用该功能(支持一致Hash 和节点总数静态Hash),将查询只发送到指定Hash
节点以减少参与运算的节点以及coordinator 节点和data 节点的连接消耗。
使用优化方法
1)
设置集群配置参数gcluster_special_correlated_optimize = 0 | 1,
该参数用于设置
是否尝试对相关子查询进行动态重分布优化。参数值为0 表示关闭本优化,参数
值为1 表示开启本优化,默认开启。
2)设置集群配置参数gcluster_crossjoin_use_hash_distribution=0 | 1,用于在JOIN
两边都不是hash 列时,
设置是否仍强制使用相关子查询进行动态重分布优化。

数值为0 表示关闭优化,参数值为1 表示开启优化,默认值开启。
说明
上面的两个参数属于父子参数关系。

当gcluster_special_correlated_optimize = 0 时,无论如何设置
参数gcluster_crossjoin_use_hash_distribution 的值,
都不会开启本优
化。

当gcluster_special_correlated_optimize = 1,而
gcluster_crossjoin_use_hash_distribution = 0 时,也不会开启本优化。

当gcluster_special_correlated_optimize = 1,并且
gcluster_crossjoin_use_hash_distribution = 1 时,才会开启本优化。
示例
首先,
使用SET 语句设置上面2 个参数的值都为1,
下面的语句可以进行等值hash
查询优化。
SELECT COUNT(*) FROM x1 WHERE EXISTS(SELECT 1 FROM x2
WHERE x1.id2 = x2.id2);
使用约束

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1309

查询语句中,使用了跨层关系,禁止优化。
下面的SQL 语句不会进行优化,因为x3.id3 = x1.id3 是跨层相关子查询的条
件,所以不能优化。
SELECT COUNT(*) FROM
x1 WHERE
EXISTS
(
SELECT 1 FROM x2 WHERE
x2.id2 = x1.id2
AND EXISTS
(
SELECT 1 FROM x3 WHERE
x3.id3 = x1.id3
)
);

查询语句中,使用了跨层子查询,并且跨层列出现在PROJECTION 部分时,
禁止优化。
下面的SQL 语句不会进行优化,因为SELECT x1.entry_id FROM x3 中,x1
和x3 属于跨层关系(不是父子关系),并且x1.entry_id 出现在最里面的子
查询的PROJECTION 部分,所以不能优化。
SELECT Count(*) FROM
x1
WHERE
EXISTS
(
SELECT 1 FROM
x2
WHERE
x2.id2 = x1.id2
AND x2.entry_id IN
(
SELECT x1.entry_id FROM x3 WHERE
x2.id3 = x3.id3
)
);

查询语句中,相关子查询在HAVING 中,禁止优化。
下面的SQL 语句不会进行优化,因为HAVING 中包含了子查询语句。
SELECT
COUNT(*) FROM
x1 GROUP BY id2
HAVING EXISTS
(
SELECT 1 FROM x2 WHERE
x2.id2 = x1.id2
);

查询语句中,相关子查询属于PROJECTION 部分,禁止优化。
下面的SQL 语句不会进行优化,因为子查询语句SELECT 1 FROM x2
WHERE x1.id2 = x2.id2 LIMIT 1 属于外部查询语句的PROJECTION 部分,

以不能优化。
SELECT
(
SELECT 1 FROM
x2 WHERE
x1.id2 = x2.id2 LIMIT
1

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1310
) FROM x1;

查询语句中,
两层相关子查询,
外层不能走优化,
导致内层一并不能走优化。
下面的SQL 语句不会进行优化,
因为最外层子查询语句SELECT 1 FROM x2
WHERE x1.id2 > x2.id2 中不是等值查询条件,所以不能优化。
SELECT COUNT(*) FROM x1
WHERE EXISTS
(
SELECT 1 FROM x2
WHERE x1.id2 > x2.id2
AND EXISTS
(
SELECT 1 FROM x3 WHERE x3.id3 = x2.id3
)
);

查询语句中,相关条件不是out.col = inner.col 类型(如out.col > inner.col,或
者不是单纯的字段,而是表达式,如ABS(out.col) = inner.col,都是不支持优
化的)。
下面的SQL 语句不会进行优化,因为子查询语句中ABS(x1.id2) = x2.id2 使
用了函数,所以不能优化。
SELECT COUNT(*) FROM x1 WHERE EXISTS(SELECT 1 FROM x2
WHERE ABS(x1.id2) = x2.id2);


“数据库导航”
中,
右键单击Schema 节点下的函数过程节点中的函数过
程,选择菜单中的“刷新”菜单项,将对函数过程进行刷新,如下图所示:

GBaseDataStudio 管理工具手册
南大通用数据技术股份有限公司
- 333 -
图5- 738 刷新函数过程

|
14 | three | 2013-06-22 | 161.218 |
|
30 | third | 2013-09-04 |