返回首页

gbase数据、南大通用产品文档:GBase8s优化消息传输

更新日期:2024年09月11日

GBase 8s ESQL/C 提供名为优化消息传输的功能,它可以让大多数 GBase 8s ESQL/C
语句使数据库服务器的信息传输最小化。
GBase 8s ESQL/C 通过将消息链接在一起,甚至消除一些小的消息数据包来实现优化
的消息传输。当优化的消息传输功能被启用时,GBase 8s ESQL/C 期望 SQL 语句将会成
功。因此,GBase 8s ESQL/C 在某些情况下消除了数据库服务器的确认消息。
当启用 OPTMSG 功能时,您的 GBase 8s ESQL/C 应用程序无法对任何链接的语句
执行错误处理。如果您不确定特定语句是否可能生成错误,请包括错误处理代码,并且不
要为该语句启用消息链接。
优化消息传输的限制
GBase 8s ESQL/C 不会链接以下 SQL 语句,即使您启用了优化消息传输:
COMMIT WORK
DESCRIBE
EXECUTE
FETCH
FLUSH
PREPARE
PUT
ROLLBACK WORK
SELECT INTO (singleton SELECT)
当 GBase 8s ESQL/C 到达以上任一语句时,
它将消息刷新到数据库服务器。
GBase 8s
ESQL/C 然后继续后续的 SQL 语句的消息链接。只有需要网络流量的 SQL 语句才能使
GBase 8s ESQL/C 刷新消息。
不需要网络流量的 SQL 语句(如 DECLARE 语句)不会导致 GBase 8s ESQL/C 将
消息队列发送到数据库服务器。
启用优化消息传输
要启用优化消息传输,或消息链接,您必须在客户端环境中设置以下变量:

在运行时设置 OPTMSG 环境变量,以使所有的合格 SQL 语句启用优化消息传输。
在 GBase 8s ESQL/C 应用程序中设置 OptMsg 全局变量,以控制哪些 SQL 语句使

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

用消息链接。
设置 OPTMSG 环境变量
OPTMSG 环境变量为应用程序中的所有 SQL 语句启用优化消息传输。

可以将以下值分配给 OPTMSG 环境变量:
1
该值启用优化消息传输, 实现后续任何连接的功能。
0
该值禁用优化消息传输。(缺省)

OPTMSG 环境变量的缺省值为 0。将 OPTMSG 设置为 0 来将禁用显示消息。您可
能需要禁用针对需要即时回复或用于调试目的的语句的优化消息传输。

要启用优化消息传输,您必须在启动 GBase 8s ESQL/C 应用程序前设置 OPTMSG 。


在 UNIX(TM) 操作系统中,可以使用 putenv() 系统调用在应用程序中设置 OPTMSG
(只要您的系统支持 putenv() 函数)

例如,
以下对 putenv() 的调用,
启用优化消息传输:
putenv("OPTMSG=1");

在 Windows(TM) 环境中,可以使用 ifx_putenv() 函数在应用程序中设置 OPTMSG。
例如,以下 ifx_putenv()调用,启用优化消息传输:
ifx_putenv("OPTMSG=1");

当您在应用程序中设置 OPTMSG 时,可以激活或停用每个连接或每个线程中优化的
消息传输。要启用优化消息传输,必须在建立连接前设置 OPTMSG。
设置 OptMsg 全局变量
OptMsg 全局变量在 GBase 8s ESQL/Csqlhdr.h 头文件中定义。

当将 OPTMSG 环境变量设置为 1 后,您必须设置 OptMsg 全局变量来指定消息链
接是否对每个后续 SQL 语句生效。您可以将以下值分配给 OptMsg:
1
该值对每一条后续 SQL 语句启用消息链接。

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

0
该值对每一条后续 SQL 语句禁用消息链接。

将 OPTMSG 环境变量设置为 1,您仍然必须将 OptMsg 全局变量设置为 1 来启用
消息链接。如果您从程序中忽略以下语句,则 GBase 8s ESQL/C 不会执行消息链接:
OptMsg = 1;

当您已经将 OPTMSG 环境变量设置为 1 时,您可能会出于以下原因禁用链接:
某些 SQL 语句需要立即回复。

限制 SQL 语句完成后重新启用 OPTMSG 功能。

出于调试目的
当您尝试确定每个 SQL 语句的响应方式时,可以禁用 OPTMSG 功能。

在程序中的最后一个 SQL 语句执行之前,确保数据库服务器在应用程序退出之前处
理所有消息。如果启用 OPTMSG,则该消息将排队等待数据库服务器,但不会发送进行处
理。

要避免意外链接,
请在需要的 SQL 语句之后立即重置 OptMsg 全局变量。
以下代码
片段为 DELETE 语句启用消息链接:
OptMsg = 1;
EXEC SQL delete from customer;
OptMsg = 0;
EXEC SQL create index ix1 on customer (zipcode);

此示例启用消息链接因为 DELETE 语句的执行不可能失效。因此,它可以安全地链
接到下一个 SQL 语句。GBase 8s ESQL/C 延迟发送 DELETE 语句的信息。该示例在
DELETE 语句之后禁用消息链接,
以使 GBase 8s ESQL/C 刷新下一个 SQL 语句执行时已
排队的所有消息。通过禁用 DELETE 之后的消息链接,代码片段避免了意外的消息链接。
当发生意外的链接时,可能很难确定哪些链接的语句失败。

在 CREATE INDEX 语句中,
GBase 8s ESQL/C 将 DELETE 和 CREATE INDEX 语
句发送给数据库服务器。

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

使用优化消息传输处理错误
当启用 OPTMSG 功能时,您的 GBase 8s ESQL/C 应用程序无法对任何链接的语句
执行错误处理。如果您不确定特定语句是否可能生成错误,请包括错误处理代码,并且不
要为该语句启用消息链接。

当在链接的语句中发生错误时,数据库服务器停止执行。此错误之后的任何 SQL 语
句都不会执行。例如,以下代码旨在链接五个 INSERT 语句(该片段假设 OPTMSG 环境
变量设置为 1):
EXEC SQL create table tab1 (col1 INTEGER);

/* enable message chaining */
OptMsg = 1;

/* these two INSERT statements execute successfully */
EXEC SQL insert into tab1 values (1);
EXEC SQL insert into tab1 values (2);

/* this INSERT statement generates an error because the data
* in the VALUES clause is not compatible with the column type */
EXEC SQL insert into tab1 values ('a');

/* these two INSERT statements never execute */
EXEC SQL insert into tab1 values (3);
EXEC SQL insert into tab1 values (4);

/* disable message chaining */
OptMsg = 0;

/* update one of the tab1 rows */
EXEC SQL update tab1 set col1 = 5 where col1 = 2;
if ( SQLCODE < 0 )
?


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

在此代码片段中,GBase 8s ESQL/C 在到达 UPDATE 语句时刷新消息队列。将五个
INSERT 语句和 UPDATE 语句发送到数据库服务器执行。
因为第三个 INSERT 语句发生
错误,所以数据库服务器不执行剩余的 INSERT 语句和 UPDATE 语句。UPDATE 语句
(它是链接语句中的最后一个语句)从失败的 INSERT 语句返回错误。tab1 表包含 col1
值为 1 和 2 的行。

可以使用 onstat -X 命令获取关于正在等待缓冲区的线程的确切信息。
对于每个使用中的缓冲区,onstat -X 命令显示一般的缓冲区信息,这些信息也可以使用
onstat -b 或 onstat -B 命令获得。有关更多信息,请参阅 onstat -b 命令:打印正在使用的
缓冲区信息 中的 onstat -b 命令。

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

语法:

示例输出
图: onstat -X 命令输出

输出描述
onstat -X 命令具有 waiter 字段,
用以列出所有正在等待缓冲区的用户线程,
而 onstat -b 和
onstat -B 命令包含 waitlist 字段,它显示正在等待缓冲区的第一个用户线程的地址。共享
缓冲区的最大数量以 ONCONFIG 文件中 BUFFERPOOL 配置参数的 buffers 字段进行
指定。
Buffer pool page size
以字节表示的缓冲池页面大小
address
缓冲区表中缓冲区头的地址
flags
指示缓存页当前状态的标志:
0x01
已修改数据
0x02
数据
0x04
LRU
0x08
错误
0x10
共享锁
0x20
正在进行 LRU AIO 写
0x40
正在进行 Chunk 写
0x10

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

互斥锁
0x100
清除程序已指定到 LRU
0x200
缓冲区应该避免 bf_check 调用
0x400
在写页面之前进行日志清空
0x800
缓冲区已进行缓冲区检查
0x8000
缓冲区已固定
pagenum
磁盘上的物理页数
memaddr
缓冲区内存地址
nslots
页中 solt 表的条目的数量
该字段指示存储在该页上的行(或行的一部分)的数量
pgflgs
使用以下值(单独或组合)来描述页类型:
1
数据页
2
Tblspace 页
4
可用列表页
8
Chunk 可用列表页
9
剩余数据页
b
分区常驻 blobpage
c
Blobspace 常驻 blobpage
d

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

Blob chunk 可用列表位页
e
Blob chunk blob 图页
10
B-tree 节点页
20
B-tree 根节点页
40
B-tree 分支节点页
80
B-tree 叶节点页
100
逻辑日志页
200
逻辑日志的最后一页
400
逻辑日志的同步页
800
物理日志
1000
保留根页
2000
不需要物理日志
8000
带有缺省标志的 B-tree 叶
scount
显示正在等待缓冲区的线程数
waiter
列出正在等待缓冲区的所有用户线程的地址

GBA-01EX-0006
错误码
错误标识
错误信息
GBA-01EX-000
6
ER_EXPRESS_OUTOFM
EMORY
Express out of resources error:%s
错误出现原因
资源申请失败
分析与建议
根据情况调整各个buffer 设置