返回首页

gbase数据、南大通用产品文档:GBase8s在 Windows 系统上安装 Client SDK 和 GBase Connect

更新日期:2024年09月11日

...................................
- 42 -

说明
当查询所涉及的表存在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);

在 Java™ 程序中使用 JDBC API SQLException 类来处理错误。在 Java 程序之外,也可使
用特定于 GBase 8s 的 com.gbasedbt.jdbc.Message类,来检索对于给定错误编号的 GBase
8s 错误文本。