返回首页

gbase数据、南大通用产品文档:GBase8aHASH JOIN 优化

更新日期:2024年09月11日

需要进行大数据量处理的分析型数据库中,join 过程在查询耗时中占很大比重,
其中HASH JOIN 又是最常见的JOIN 类型。因此,提升HASH JOIN 算子的性能
对整体查询效能的提升有重要意义。
One-Pass Hash Join 算法是HASH JOIN 的一种优化算法。通过对JOIN 双方先进
行哈希划分,
同组分片进行HASH JOIN,
最后合并各组JOIN 结果的方法,
使JOIN
耗时随数据量的增长呈线性增长趋势。这个改进提高了HASH JOIN 算法对数据
增长的适应性,同时也大幅提升了大数据量下的查询效能。

开启
One-Pass
Hash
Join
需要配置
GNode
配置文件选项
_gbase_one_pass_hash_join;

当_gbase_one_pass_hash_join = 0 或未设置时,
使用GBase 8a MPP CLuster 原
始Hash Join 算法;

当_gbase_one_pass_hash_join = 1 时,根据traverse 表的数据量和hash buffer
大小自动评估是否使用One-Pass Hash Join 算法。如果hash buffer 不能容纳
traverse 表全表所建的哈希表,则使用One-Pass Hash Join 算法,否则使用原
始Hash Join 算法;

当_gbase_one_pass_hash_join = 2 时,
不进行判断直接使用One-Pass Hash Join
算法。
注意
当前的One-Pass Hash Join 实现只在并行时生效,即需要在配置文件中设置
gbase_parallel_execution = 1。

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

可以使用 onstat -x 命令显示在数据库服务器上的事务信息。
语法:

只有在以下情况下事务信息才是必需的:
 X/Open 环境
 参与分布式查询的数据库服务器
 数据库服务使用 Microsoft™ Transaction Server (MTS)事务管理器
示例输出
图: onstat -x 命令输出

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 663 -

输出描述
可以如下解释 onstat -x 命令输出:
address
事务结构的共享内存地址
flags
位置 1 的标志代码(当前事务状态):
A
用户线程已连接到事务
S
TP/XA 暂挂的事务
C
TP/XA 正在等待回滚
位置 2 的标志代码(事务方式):
T
紧耦合方式(MTS)
L
松耦合方式(缺省方式)
位置 3 的标志代码(事务阶段):

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 664 -
B
开始工作
P
准备好用于提交的分布式查询
X
准备好用于提交的 TP/XA
C
正在提交或已提交
R
正在回滚或已回滚
H
正在尝试回滚或已回滚
位置 4 的标志代码
X
XA 事务
位置 5 的标志代码 (事务的类型):
G
全局事务
C
分布式查询协调者
S
分布式查询从属者
B
分布式查询协调者和从属者
M
重新定向的全局事务
userthread
拥有事务的线程(rstcb 地址)
locks
事务持有的锁数
begin logpos
BEGIN WORK 记录已记录到其中的日志
current logpos
事务最近写入的日志的当前日志位置 (当事务回滚时,当前日志位置会回退直到它到达起
始日志位置。 当到达起始日志位置,回滚结束。)

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 665 -
isol
隔离级别
est. rb time
服务器回滚该事务所需的估计时间。随着事务前进,该时间增长。如果事务回滚,那么该
时间随着事务的展开而减少
retrys
启动分布式查询的恢复线程的尝试次数
coord
从属者正在执行事务时事务协调者的名称
该字段告诉您哪个数据库服务器正在协调两阶段提交
onstat -x 命令输出的最后一行指示 8 是自初始化数据库服务器以来并发事务的最大数。

确定逻辑日志记录的位置
可以使用 onstat -x 命令确定逻辑日志记录的位置。
curlog 和 logposit 字段提供了逻辑日志记录的确切位置。如果事务不在回滚,curlog 和
logposit 描述最新写入的日志记录的位置。当事务正在回滚时,这些字段描述最新“撤销”
的日志记录的位置。
随着事务的回滚,
curlog 和 logposit 值下降。
在长事务中,
logposit 和
beginlg 值的聚集率可以帮助您估计回滚还将花费多少时间。
有关 onstat -x 命令示例,
请参阅 GBase 8s 管理员指南 中的多阶段提交协议一章中的监视
全局事务。
确定全局事务的方式
onstat -x 命令对确定全局事务是以松耦合方式还是以紧耦合方式执行很有用。
onstat -x 命令输出的 flag 列的第二个位置显示全局事务的标志。T 标志指示紧耦合方式,
L 标志指示松耦合方式。
 松耦合方式意味着不同的数据库服务器协调事务但不共享锁。全局事务中的每个分
支都具有独立的事务 XID 。
在逻辑日志中,
所有分支的记录都显示为独立的事务。

 紧耦合方式意味着不同数据库服务器协调事务并共享诸如锁和日志之类的资源。在
全局事务中,访问同一数据库的所有分支共享同一事务 XID 。具有相同 XID 的
分支的日志记录显示在同一会话 ID 下面。MTS 使用紧耦合方式。

GBase 8s ESQL/C 运行开发者指定用于一组语句的运行时上下文。运行上下文保存
GBase 8s ESQL/C 必须维护的所有特定于线程的数据,包括当前状态和游标。
此功能允许 GBase 8s ESQL/C 程序员能够提高其 MESQL/C 应用程序的性能。通过
使用 SQLCONTEXT 定义和指令,减少了线程特定数据块查找的数量。
以下嵌入式 SQL 语句支持运行上下文的定义和用法:
SQLCONTEXT context_var;
PARAMETER SQLCONTEXT param_context_var;
BEGIN SQLCONTEXT OPTIMIZATION;
END SQLCONTEXT OPTIMIZATION;
仅在使用 esql-thread 选项时才能识别 SQLCONTEXT 定义和语句。如果未指定
-thread 选项,则忽略此语句。
SQLCONTEXT 语句的用法导致 ESQL/C 预处理器在 .c 文件中生成的代码与不存
在 SQLCONTEXT 语句时生成的代码的不同。
下列 SQLCONTEXT 定义生成代码来定义并将 SQLCONTEXT 的值设置为运行上
下文的句柄:
SQLCONTEXT context_var;
以下 SQLCONTEXT 用于生成代码来定义包含运行上下文句柄的参数:

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 399 -

PARAMETER SQLCONTEXT param_context_var;
以下 BEGIN SQLCONTEXT 指令使源文件中的所有语句都位于其中,以使用指定的
运行时上下文,直到看到 END CONTEXT 指令:
BEGIN SQLCONTEXT OPTIMIZATION;
...
END SQLCONTEXT OPTIMIZATION;
END SQLCONTEXT 指令出现在当前使用的 SQLTCONTEXT 定义的范围之前,或
者发生“undefined symbol sql_context_var”错误编译时。