返回首页

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
查询优化。

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1317
SELECT COUNT(*) FROM x1 WHERE EXISTS(SELECT 1 FROM x2
WHERE x1.id2 = x2.id2);
使用约束

查询语句中,使用了跨层关系,禁止优化。
下面的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 部分,


GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1318
以不能优化。
SELECT
(
SELECT 1 FROM
x2 WHERE
x1.id2 = x2.id2 LIMIT
1
) 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);

功能描述
与数据库服务器建立一次非阻塞的连接。
原型
PGconn* PQconnectStart(const char* conninfo);
参数
表8-36 PQconnectStart 参数
关键字
参数说明
conninfo
连接信息字符串。可以为空,这样将会使用默认参数。也可以包
含由空格分隔的一个或多个参数设置,还可以包含一个URL。
返回值
PGconn 类型指针。

 摘要:
允许或禁止连接的选项
 语法:
int
gbase_set_server_option(GBASE *gbase, enum
enum_gbase_set_option option);
 参数:
gbase

数据库句柄
option
GBASE_OPTION_MULTI_STATEMENTS_ON 允许多语句支持
GBASE_OPTION_MULTI_STATEMENTS_OFF
禁止多语句支持



GBase 8a 程序员手册C API 篇
南大通用数据技术股份有限公司

- 45 -
 返回值:
0 表示成功,非0 值表示出现错误。
 错误
CR_COMMANDS_OUT_OF_SYNC
以不恰当的顺序执行了命令。
CR_SERVER_GONE_ERROR

GBase 服务器不可用。
CR_SERVER_LOST


在查询过程中,与服务器的连接丢失。