返回首页

gbase数据、南大通用产品文档:GBase8aOLAP 开窗函数参数优化

更新日期:2024年09月11日

gbase 的开窗函数中sum、avg 运行性能随窗口大小变大而性能下降,可通过
调整参数gbase_buffer_rowset 的值来提升性能。gbase_buffer_rowset 表示保存中
间结果集的内存上限。

执行原理:
在进行olap 计算时,首先根据gbase_buffer_rowset 参数为计算过程分配保存
中间结果集的内存空间,将gbase_buffer_rowset 分成n 块,n 由最大线程数和
parallel_degree 决定,计算过程中可以使用这些buffer。然后由于计算过程中只保
存olap 列信息,
所以又将buffer 除以olap 列的列宽得到一个buffer 可以表示的行
数,此时,若存在一个partition 的行数超过一个buffer 保存行数的上限,超过的
部分保存在下一个buffer,而在窗口一行一行地滑动计算时,若一个partition 跨
buffer 保存,滑动过程中会跨buffer 访问数据,就会导致频繁的换入换出,换入
换出的次数最大能达到窗口的大小,所以,若窗口过大且存在较大的partition,
就会造成频繁的换入换出,造成性能损耗。

参数设置:
提前评估数据表中最大的partition 的数据量,按照以下公式进行计算调整
gbase_buffer_rowset 的值,增加buffer 的内存,尽量在一个buffer 内保存最大的
partition,以尽量减少跨buffer 访问的次数。
max_partition_size*列宽(进行olap 函数计算的列,如sum(a),若a 列为double 类
型,则列宽为8)得到一个buffer 的值。然后再考虑gbase_parallel_degree 参数,
若degree 值为0,则将这个buffer 的值乘以最大线程数

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1285
gbase_parallel_max_thread_in_pool 的一半,
得到的结果向上取到2 的n 次方后
(如
1024,512 等),就得到一个比较适合的rowset 值。
若gbase_parallel_degree 参数不为0,则将buffer 的值乘以最大线程数
gbase_parallel_max_thread_in_pool,得到的结果向上取到2 的n 次方后,得到一
个比较合适的rowset 值。
最后重新set gbase_buffer_rowset。

总结:
if(dregree == 0)
max_partition_size*列宽*gbase_parallel_max_thread_in_pool/2 = rowset;
else
max_partition_size*列宽*gbase_parallel_max_thread_in_pool = rowset;
例如:
create table sales(
sales_employee varchar(50) not null,
fiscal_year varchar(50) not null,
sale decimal(14,2) not null,
primary key(sales_employee,fiscal_year)
);
select
fiscal_year,
sales_employee,
sale,
avg(sale) over (partition by sales_employee order by fiscal_year
ROWS BETWEEN 10000 PRECEDING AND 10000 FOLLOWING) total_sales
from sales;
加载数据4 千万;设置参数gbase_buffer_rowset=3073741824,执行性能较为稳定,
不会因窗口大小变化而性能波动。

在使用 UDT 和 UDR Manager 工具之前,请按照以下步骤执行任务:

请确保您的数据库服务器支持 Java™。
UDT 和 UDR Manager 工具在不支持 Java 的服务器上无法运行。

您的 CLASSPATH 设置中包含 ifxtools.jar 或 ifxtools_g.jar 文件。

在数据库服务器中创建名为 /usr/gbasedbt 的目录,将它的所有者和组设置为用
户 gbasedbt,将权限设置为 777。

将以下条目添加到数据库服务器的 /etc/group 文件中。
gbasedbt::unique-id-number:

检查驱动程序和数据库服务器的发版说明,以获取此版本中的进一步的限制。

要有效地使用触发器,需要理解触发语句和生成的触发操作之间的关系。在指定发生触发
操作的时间(即,BEFORE 、AFTER 或 FOR EACH ROW)时定义此关系。