返回首页

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,
就会造成频繁的换入换出,造成性能损耗。

参数设置:

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1292
提前评估数据表中最大的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_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,执行性能较为稳定,
不会因窗口大小变化而性能波动。

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

当使用 UDTManager 和 UDRManager 类在数据库中创建不透明类型和 Java™ UDR 时,驱
动程序映射 Java 方法参数并根据本节中的表返回类型的 SQL数据类型。不支持未在这些
表中显示的任何数据类型。
如果 Java™ 方法具有以下任何 Java 类型的参数,则参数和返回类型将映射到服务器中的
SQL 类型,如下表所示。该表显示每个 Java 数据类型映射到的 GBase 8s 数据类型。
Java 数据类型
SQL 数据类型
boolean, java.lang.Boolean
BOOLEAN
char
CHAR(1)

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 284
-
Java 数据类型
SQL 数据类型
byte
CHAR(1)
short, java.lang.Short
SMALLINT
int, java.lang.Integer
INT
long, java.lang.Long
INT8
float, java.lang.Float
SMALLFLOAT
double, java.lang.Double
FLOAT1
java.lang.String
LVARCHAR
java.math.BigDecimal
DECIMAL
缺省精度由服务器设置:ANSI 数据库为
DECIMAL(16,0) ;非 ANSI 数据库为 decimal (16,255)
java.sql.Date
DATE
java.sql.Time
DATETIME HOUR TO SECOND
java.sql.Timestamp
DATETIME YEAR TO FRACTION(5)
com.gbasedbt.lang.IntervalY
M
INTERVAL YEAR TO MONTH
com.gbasedbt.lang.IntervalD
F
INTERVAL DAY TO FRACTION(5)
java.sql.Blob
BLOB
java.sql.Clob
CLOB
1 此映射是 JDBC 兼容的。通过将 IFX_GET_SMFLOAT_AS_FLOAT 环境变量设置为 1,
可以将 Java double 数据类型(通过 JDBC FLOAT 数据类型)映射到 GBase
8s SMALLFLOAT 数据类型以实现向后兼容。
映射转换类型
下表显示了在 UDTMetaData.setXXXCast() 方法中为 ifxtype 参数定义的类型与服务器中的
SQL 数据类型之间支持的映射。

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 285
-
来自 com.gbasedbt.lang.IfxTypes 的 ifxtype 参数类

GBase 8s 数据类

IFX_TYPE_CHAR
CHAR
IFX_TYPE_SMALLINT
SMALLINT
IFX_TYPE_INT
INT
IFX_TYPE_FLOAT
FLOAT
IFX_TYPE_SMFLOAT
SMALLFLOAT
IFX_TYPE_DECIMAL
DECIMAL
IFX_TYPE_SERIAL
SERIAL
IFX_TYPE_DATE
DATE
IFX_TYPE_MONEY
MONEY
IFX_TYPE_DATETIME
DATETIME
IFX_TYPE_BYTE
BYTE
IFX_TYPE_TEXT
TEXT
IFX_TYPE_VARCHAR
VARCHAR
IFX_TYPE_INTERVAL
INTERVAL
IFX_TYPE_NCHAR
NCHAR
IFX_TYPE_NVARCHAR
NVARCHAR
IFX_TYPE_INT8
INT8
IFX_TYPE_SERIAL8
SERIAL8
IFX_TYPE_LVARCHAR
LVARCHAR
IFX_TYPE_SENDRECV
SENDRECV
IFX_TYPE_BOOL
BOOLEAN
IFX_TYPE_IMPEXP
IMPEXP

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 286
-
来自 com.gbasedbt.lang.IfxTypes 的 ifxtype 参数类

GBase 8s 数据类

IFX_TYPE_IMPEXPBIN
IMPEXPBIN
IFX_TYPE_CLOB
CLOB
IFX_TYPE_BLOB
BLOB
映射字段类型
下表显示了在 UDTMetaData.setFieldType() 方法中为 ifxtype 参数定义的类型与在 Java™ 类
文件中出现的 Java 数据类型之间支持的映射。
未在此表中显示的数据类型在不透明类型中
不支持。
来自
com.gbasedbt.lang.IfxTypes 的
ifxtype 参数类型
Java 数据类型
IFX_TYPE_BIGINT
long
IFX_TYPE_BIGSERIAL
long
IFX_TYPE_CHAR
java.lang.String
IFX_TYPE_SMALLINT
short
IFX_TYPE_INT
int
IFX_TYPE_FLOAT
double
IFX_TYPE_SMFLOAT
float1
IFX_TYPE_DECIMAL
java.lang.BigDecimal
IFX_TYPE_SERIAL
int
IFX_TYPE_DATE
Date
IFX_TYPE_MONEY
java.lang.BigDecimal
IFX_TYPE_DATETIME
如果起始限定符为年、月或日,则为
java.lang.Timestamp ;
否则为 java.lang.Time
(请
参阅 字段长度和 DATETIME 数据)。

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 287
-
来自
com.gbasedbt.lang.IfxTypes 的
ifxtype 参数类型
Java 数据类型
IFX_TYPE_INTERVAL
如果起始限定符为年、月或日,则为
com.gbasedbt.lang.IfxIntervalYM;否则为
com.gbasedbt.lang.IfxIntervalDF (请参阅 字段
长度和 DATETIME 数据)。
IFX_TYPE_NCHAR
java.lang.String
IFX_TYPE_INT8
long
IFX_TYPE_SERIAL8
long
IFX_TYPE_BOOL
boolean
IFX_TYPE_CLOB
java.sql.Clob
IFX_TYPE_BLOB
java.sql.Blob
1 此映射是 JDBC 兼容的。通过将 IFX_GET_SMFLOAT_AS_FLOAT 环境变量设置为 1,
将 IFX_TYPE_SMFLOAT 数据类型(通过 JDBC FLOAT 数据类型)映射到 Java double
数据类型以实现向后兼容。
字段长度和 DATETIME 数据
当通过调
用 setFieldType(IFX_TYPE_DATETIME) 或 setFieldType(IFX_TYPE_INTERVAL) 将字段类
型设置为 date-time 或 interval 数据类型时,驱动程序会将 date-time 字段映射
为 java.sql.Timestamp 或 java.sql.Time,这取决于调用 setFieldLength() 时设置的编码长度。
例如,给出一个 date-time 字段的标准格式为 YYYY-MM-DD HH:MM:SS,驱动程序会使
用以下映射算法:

如果编码长度具有 hour 或更小的起始码,则会映射为 java.sql.Time。

如果编码长度具有 year 或更小的起始码,则会映射为 java.sql.TimeStamp。
对于 interval,标准为 YYYY-MM 或 DD HH:MM:SS.frac。其映射如下:

如果编码长度具有 day 或更小的起始码,则它映射
为 com.gbasedbt.jdbc.IfxIntervalDF。

如果编码长度具有 year 或更小的起始码,则它映射
为 com.gbasedbt.jdbc.IfxIntervalYM。


GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 288
-

获取需要用于执行数据库删除命令的GBaseCommand 对象,
该对象是自动生
成的。

语法
[Visual Basic]
Public Function GetDeleteCommand As GBaseCommand
[C#]
public GBaseCommand GetDeleteCommand()

返回值
用于执行删除操作的GBaseCommand 对象。

注释
用户可以使用GetDeleteCommand 作为删除命令的基础。例如,用户可以调
用GetDeleteCommand 后修改删除语句内容后重新设置给GBaseDataAdapter 的
DeleteCommand 属性。
应用程序应该在任何关联到GBaseCommandBuilder 上的SQL 语句改变后调
用RefreshSchema。否则,GetDeleteCommand 会依然使用前面语句的信息,这
可能是错误的,
并且当应用程序调用Update 或 GetDeleteCommand 的时候,
SQL
语句仍是最初产生的。

GBase 8a 程序员手册ADO.NET 篇


- 154 -

南大通用数据技术股份有限公司