返回首页

gbase数据、南大通用产品文档:GBase8sifx_getserial8() 函数

更新日期:2024年09月11日

ifx_getserial8() 函数返回插入至 int8 主变量内的最后一行的 SERIAL8 值。
语法
void ifx_getserial8(serial8_val)
ifx_int8_t *serial8_val;
serial8_val
指向 ifx_getserial8() 在其中放置新插入的 SERIAL8 值的 int8 结构的指针。

用法
在您插入包含 SERIAL8 列的行之后,请使用 ifx_getserial8() 函数。该函数返回您声
明的 int8 变量、serial8_val 中新的 SERIAL8 值。如果 INSERT 语句生成了新的
SERIAL8 值,
则 serial8_val 指向大于零的值。
零或空的 SERIAL8 值指示无效的 INSERT;
该 INSERT 可能以失败,或可能尚未执行。

示例
EXEC SQL BEGIN DECLARE SECTION;
int8 order_num;
int8 rep_num;
char str[20];
EXEC SQL END DECLARE SECTION;

EXEC SQL create table order2
(
order_number SERIAL8(1001),

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

order_date DATE,
customer_num INTEGER,
backlog CHAR(1),
po_num CHAR(10),
paid_date DATE,
sales_rep INT8
);
EXEC SQL insert into order2 (order_number, sales_rep)
values (0, :rep_num);
if (SQLCODE == 0)
{
ifx_getserial8(order_num);
if (ifx_int8toasc(ℴ_num, str, 20) == 0)
printf("New order number is %s\n", str);
}

构造的分发是准确的。因为收集更多的信息,此模式比 LOW 或 MEDIUM 模式
执行得更慢。如果您使用 UPDATE STATISTICS 的 HIGH 模式选项,则数据库
服务器可花费相当多的时间来收集跨数据库的信息,特别是带有大型表的数据

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1152
库。HIGH 模式可能扫描每一表的每一列多次。要最小化处理时间,请指定表名
称和那个表内的列名称,而不是接受所有表的缺省的范围。
然而,对于 LVARCHAR、BYTE 或 TEXT 列,不计算分发。
你必须有 DBA 权限或是该表的所有者来创建 HIGH 模式分发。要获取更多关于
MEDIUM 和 HIGH 模式选项的信息,请参阅主题 Resolution 子句。
Resolution 子句
在 MEDIUM 或 HIGH 模式下,使用 Resolution 子句来调整分发 bin 的大小,
并避免在索引上计算数据。
仅在 MEDIUM 模式下,您还可使用 Resolution 子句来指定对采样大小的较低限
定,并调整信任级别。
Resolution 子句

MEDIUM 模式的 Resolution 子句

HIGH 模式的 Resolution 子句

元素
描述
限制
语法
confidence
在 MEDIUM 模式下采样的估计的可
能性产生的结果正好等同于 HIGH
模式。缺省的级别为 0.95。
必须在从 0.80
(最小)至 0.99
(最大)的范围内
精确
数值

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1153
元素
描述
限制
语法
percent
在每一分发 bin 中采样的平均百
分率。MEDIUM 的缺省值为 2.5,
HIGH 的缺省值为 0.5。
对于表中的行数
nrows,最小值为
1/nrows
精确
数值
min
在其上生成数据分发的随机选择的
行的最小整数数目
必须大于 0,但不
可超过 nrows
精确
数值
分发是列中的数据到列值的集合内的映射,按照量或对照排序。将这些样例值分
成分离的间隔,称为 bin,每一个都包含列值的样例的大约相等的部分。例如,
如果一个 bin 持有数据的 2%,则大约 50 个这样的间隔持有整个样例。
有些统计文本将这些 bin 称为 equivalence categories。每一个都包含从该列采样
的数据值的范围的分离的子集。
如果您包括 RESOLUTION 关键字,则必须有一个文字数跟在它之后,指定每一
bin 中值的 percent。在 MEDIUM 模式下,一个或两个文字数可跟在它之后,以
可选的第二个数目指定 confidence 级别, 如此例中所示:
UPDATE STATISTICS MEDIUM FOR TABLE orders
RESOLUTION 4 0.90 DISTRIBUTIONS ONLY;
这指定每 bin 数据的 4%,暗指大约 25 个 bin,以及信任级别 90%,且不检测
索引数据。如果省略了 0.90 值,则缺省的信任级别会已生效。如果省略了
RESOLUTION 关键字和两个数值,则会使用缺省的 percent 值(2.5%)和
confidence 值(0.95)。
对于包括在 WHERE 子句中的每一列,查询优化器通过测试包含在该列中的数据
值的发生比例,来估计 WHERE 子句的选择性。
您不可为 BYTE 或 TEXT 列创建分发。如果您在指定 MEDIUM 或 HIGH 分
发的 UPDATE STATISTICS 语句中包括 BYTE 或 TEXT 列,则不为那些列创
建分发。然而,为列表中的其他列创建分发,且该语句不返回错误。
VARCHAR 数据类型的列不使用溢出 bin,即使正在为重复的值使用多个 bin
时。
当 UPDATE STATISTICS 语句构建列分布时,您可使用 DBUPSPACE 环境变量
的前两个参数来限制 UPDATE STATISTICS 语句可用于数据排序的磁盘空间和内

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1154
存资源。这些设置影响性能,因为它们决定数据库服务器要扫描指定的表多少次
来构建每一分发。(当计算列分布时,第三个 DBUPSPACE 参数可控制
UPDATE STATISTICS 是否以索引排序,以及 explain 输出文件是否通过计算的
列分发来存储计划。)
指定 SAMPLING SIZE
对于计算列分发统计信息,在 MEDIUM 模式下,您可可选地使用 SAMPLING
SIZE 关键字来指定采样的行的最小数。如果 Resolution 子句省略 RESOLUTION
关键字且未指定 confidence 级别,也未指定 percent 值,则 GBase 8s 采样的行
数将会是下列两个值中的较大者:

您紧跟在 SAMPLING SIZE 关键字之后指定的 min 值

在每一 bin 中行的缺省 percent(2.5%)以及最小的 confidence 级别
(0.80)所需要的采样大小。
如果在 Resolution 子句中指定采样大小,包括为每 bin 的采样的行的平均
percent 以及为 confidence 级别的显式的值,则采样的行的数目将会是这两个
值中的较大者:

您紧跟在 SAMPLING SIZE 之后指定的 min 值

指定的行的 percent 和指定的 confidence 级别所需要的采样大小。
如果在 Resolution 子句中指定采样大小,包括平均的 percentage 值,但未设置
confidence 级别,则使用最小的 confidence 值 0.80 来计算 GBase 8s 要使用的
实际采样大小,如果指定的 size 较小的话。
例如,下列语句计算 customer 表的两列的统计信息,而不更新索引信息。将至
少采样 200 行,但样例的实际大小可能大于 200, 如果对于使用大约 50
equivalence categories 的样例分发,以每一 bin 中采样值的平均百分率 2%,
需要更多的行来提供缺省的 0.80 信任级别的话。
UPDATE STATISTICS MEDIUM FOR TABLE customer (city, state)
SAMPLING SIZE 200 RESOLUTION 2 DISTRIBUTIONS ONLY;
不管您是否在 Resolution 子句中包括显式的 SAMPLING SIZE 规范,在
MEDIUM 模式 UPDATE STATISTICS 创建的时刻, GBase 8s 都在系统目录中
记录实际的采样大小(作为该表中行的总数的百分率)。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1155
使用 DISTRIBUTIONS ONLY 选项来阻止索引信息
在 GBase 8s 中,当您指定 DISTRIBUTIONS ONLY 选项时,您不更新索引信
息。此选项不影响现有的索引信息。
使用此选项来避免可消耗大量处理时间的索引信息的测试。
此选项不影响表上信息的重新计算,诸如使用的页数、行数以及分片信息。
UPDATE STATISTICS 需要此信息来指导精确的列分发,并需要很少的时间和系
统资源来收集它。
请不要将此 DISTRIBUTIONS ONLY 选项与 LOW 模式的 DROP
DISTRIBUTIONS ONLY 选项混淆,在 MEDIUM 或 HIGH 模式下,不支持其语
法和语义。要获取如何阻止列分发的收集的信息,请参阅 使用 DROP
DISTRIBUTIONS ONLY 选项。
使用 DBUPSPACE 设置来阻止索引信息
通过将 DBUPSPACE 环境变量的第三个参数设置为值 1,您还可防止由
UPDATE STATISTICS 操作在对行排序中使用索引。要获取关于
DBSPACETEMP 和 DBUPSPACE 环境变量的信息,请参考 GBase 8s SQL 参考
指南 的第 3 章,其可限制 UPDATE STATISTICS 操作可用的系统资源。(仅当
您使用 UPDATE STATISTICS 的 HIGH 选项时,数据库服务器才使用
DBSPACETEMP 指定的存储位置。)
来自 SET EXPLAIN 语句的 UPDATE STATISTICS 的输

SET EXPLAIN 语句可显示 UPDATE STATISTICS 用来生成列分发的计划。下列
输出是基于排序内存的缺省的 DBUPSPACE 值 15 MB,在此示例中其需要两道检
验来对 21.9 MB 数据进行排序:
UPDATE STATISTICS:
==================

Table: zelaine.t1
Mode: HIGH
Number of Bins: 267 Bin size 2505

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1156
Sort data 21.9 MB Sort memory granted 15.0 MB
Estimated number of table scans 2
PASS #1 b
PASS #2 a
Scan 9 Sort 1 Build 2 Insert 0 Close 0 Total 12
Completed pass 1 in 0 minutes 12 seconds
Scan 5 Sort 2 Build 1 Insert 0 Close 0 Total 8
Completed pass 2 in 0 minutes 8 seconds
例程统计信息
在首次执行新的 SPL 例程之前,数据库服务器优化 SPL 例程中的 DML 语句。
然而,在您调用那个 SPL 例程之前,如果您使用 UPDATE STATISTICS 的
Routine Statistics 语法来更新它的查询执行计划,则可降低出错的风险,其中一些
可能引用已通过并发会话的 DDL 操作修改了其模式的表。
优化使得该代码依赖于该例程引用的表的结构。在优化该例程之后,但在执行它
之前,如果 DDL 操作修改引用的表的模式,则例程失败并报错。
然而,通常不会发生此失败,如果为引用表的例程启用自动的重新编译,而
ALTER TABLE、CREATE INDEX 或 DROP INDEX 操作已修改了这些表的话。
这是 GBase 8s 的缺省行为。要获取更多关于在更改表的模式之后启用或禁用自
动的重新优化的信息,请参阅对 SET ENVIRONMENT 语句的
IFX_AUTO_REPREPARE 选项的描述。
然而,当将 AUTO_REPREPARE 配置参数和 IFX_AUTO_REPREPARE 会话环境变量设
置为禁用 SPL 例程的重新编译,这些例程引用已修改了其模式的表时,直接地向
SPL 例程引用的表添加或删除索引可导致该例程返回错误 -710。要避免在 DDL
操作之后发生此错误,或要在已通过 DML 操作修改了表分发之后重新优化 SPL
例程,请使用 UPDATE STATISTICS 的 Routine Statistics 段来更新引用该表的
任何 SPL 例程的执行计划。
Routine Statistics

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1157

元素
描述
限制
语法
routine CREATE FUNCTION 或 CREATE
PROCEDURE 语句为 SPL 例程
声明了的名称
必须在数据库中存在。在符
合 ANSI 的数据库中,如果
您不是 owner,则以 owner
限定 routine。
标识符
下表说明 Routine Statistics 段的关键字。
关键字
优化哪一执行计划
FUNCTION
带有指定名称(以及带有与 routine 参数列表 相匹配的参数类型,如果提供的
话)的 SPL 函数的计划。 如果您指定 FUNCTION 关键字,则 UPDATE
STATISTICS 语句失败并报错,除非指定的例程返回一个值或多个值,带有或不
带有 WITH RESUME 选项。
PROCEDURE
带有指定的名称(以及与 routine 参数列表 相匹配的参数类型,如果提供的话)
的 SPL 过程的计划
ROUTINE
带有指定的名称(以及与例程参数列表相匹配的参数类型,如果提供的话)的
SPL 函数和过程的计划
SPECIFIC
名为 specific name 的 SPL 例程的计划。如果您包括 SPECIFIC 关键字,则紧跟
在关键字之后的必须是 FUNCTION、PROCEDURE 或 ROUTINE。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1158
如果您省略 SPECIFIC 关键字且未包括参数列表,则圆括号符号是可选的。
如果您未紧跟在 FOR FUNCTION、FOR PROCEDURE 或 FOR ROUTINE 关键字
之后指定 routine 名称,则为当前数据库中所有 SPL 例程优化执行计划。
数据库服务器保持一个该 SPL 例程显式地引用的表的列表。无论何时修改显式地
引用了的表,数据库服务器都在下次执行该过程时重新优化过程。
sysprocplan 系统目录表存储 SPL 例程的执行计划。两个活动可更新
sysprocplan 系统目录表:
执行使用修改了的表的 SPL 例程
UPDATE STATISTICS FOR ROUTINE、FUNCTION 或 PROCEDURE 语句。
如果您更改 SPL 例程引用的表,则可运行 UPDATE STATISTICS 来重新优化引
用该表的过程,而不是一直等到下次执行使用该表的 SPL 例程为止。然而,如果
SPL 例程引用的表被删除,则运行 UPDATE STATISTICS 不可防止该 SPL 例程
失败并报错。
更新特定的例程的统计信息的示例
下列 UPDATE STATISTICS FOR SPECIFIC 语句指导数据库服务器更新现有的返
回一个或多个值的名为 Perform_work 的函数的统计信息:
UPDATE STATISTICS FOR SPECIFIC FUNCTION Perform_work;
对于同一 Perform_work 函数,下列示例的作用与前一示例相同:
UPDATE STATISTICS FOR SPECIFIC ROUTINE Perform_work;
类似地,使用关键字 SPECIFIC PROCEDURE 或 SPECIFIC ROUTINE 来更新不
返回值的 SPECIFIC 过程的统计信息。
请不要在 SPECIFIC 例程的名称之后包括圆括号或参数列表。由于跟在名为
Perform_work 的函数之后的圆括号,下列语句失败并报错:
UPDATE STATISTICS FOR SPECIFIC ROUTINE Perform_work();
如果以圆括号括起 SPECIFIC 例程、函数或过程的参数,则数据库服务器也发出
错误。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1159
在 SPL 例程中间接地引用的更改了的表
然而,如果 SPL 例程依赖于仅被间接地引用的表,则在修改那个表之后,数据库
服务器不可检测到重新优化该过程的需要。例如,如果 SPL 调用触发器,则可间
接地引用表。如果更改由触发器引用的表的模式(但不是由 SPL 例程直接地引
用),则在运行它之前,数据库服务器不知道它应重新优化该 SPL 例程。当在已
更改了该表之后运行该过程时,可发生错误 -710。
在首次运行每一 SPL 例程时(不是当创建它时),优化它。此行为意味着 SPL
例程可以首次运行成功,但在虚拟相同的环境之下,后来会失败,如果已更改了
间接引用了的表的模式的话。SPL 例程的失败还可是间歇的,因为一次执行期间
的失败会强制内部的警告,来在下次执行之前重新优化该过程。
您可以两种方法之一来从此错误恢复:

发出 UPDATE STATISTICS 来强制执行该例程的重新优化。

重新运行该例程。
要防止此错误,您可强制重新优化该 SPL 例程。要强制重新优化,请执行下列语
句:
UPDATE STATISTICS FOR PROCEDURE routine;
您可以下列方式之一将此语句添加到您的程序:

在更改对象的模式的每一语句之后,发出 UPDATE STATISTICS。

在每一 SPL 例程的调用之前,发出 UPDATE STATISTICS。
为了提高效率,您可将 UPDATE STATISTICS 语句与在程序中较少发生的行动
(对象模式或过程的执行的更改)放在一起。在大多数情况下,在程序中较少发
生的行为是对象模式的更改。
当您遵循此方法从此错误恢复时,必须为间接引用更改了的表的每一过程执行
UPDATE STATISTICS,除非该过程也显式地引用了这些表。
在只是简单地通过重新执行 SPL 例程来修改被间接地引用了的表之后,您也可从
错误 -710 恢复。存储了的过程首次失败时,数据库服务器将该过程标记为需要
重新优化。您下一次运行该过程时,数据库服务器在运行该过程之前优化它。然
而,运行 SPL 例程两次可能既不实际也不安全。较为安全的选择是使用
UPDATE STATISTICS 语句来强制该过程的重新优化。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1160
当您升级数据库服务器时更新统计信息
当您升级数据库来使用更新的数据库服务器时,您可使用 UPDATE STATISTICS
语句来将索引转换为更新的数据库服务器使用的形式。
您可选择一次转换一个表上的索引,或一次处理整个数据库。请遵循 GBase 8s
迁移指南 中概述的转换指南。
UPDATE STATISTICS 语句在其中导致隐式地删除和重新创建表索引,是迁移到
更新的数据库服务器的仅有的上下文。
UPDATE STATISTICS 语句的性能因素
您制作的 UPDATE STATISTICS 语句检测的对象的列表越明确,它完成执行就越
快。限定列分发的数目,会提高更新速度。类似地,精度影响更新的速度。如果
所有其他关键字一样,则 LOW 运行最快,但 HIGH 检测的数据最多。
对于 GBase 8s 数据库服务器, AUTO_STAT_MODE 设置可提高刷新数据分发统计
信息的 UPDATE STATISTICS 操作的效率。 这使得数据库服务器能够有选择地仅
重新计算表或分片分发,自从上一次计算统计信息以来,作为 DML 操作的结果,
这些分发已变得陈旧了。 如同由一个显式的或缺省的 STATCHANGE 表属性定义的
阈值更改所决定的那样。 要获取关于如何设置 STATCHANGE 以及如何为仅刷新陈
旧的分发统计信息而启用 UPDATE STATISTICS 的自动模式的信息,请参阅 这些
主题:

使用 FORCE 和 AUTO 关键字

AUTO_STAT_MODE 环境选项

STATCHANGE 环境选项

CREATE TABLE 语句的 Statistics 选项

ALTER TABLE 语句的 Statistics 选项
在 LOW 模式下,在收集 UPDATE STATISTICS 操作的索引统计信息期间,
USTLOW_SAMPLE 环境选项 启用采样。对于多于 100 K 叶页的索引,使用采
样的统计信息的收集可提高 UPDATE STATISTICS 操作的速度。
UPDATE STATISTICS 语句的示例
UPDATE STATISTICS MEDIUM;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1161
UPDATE STATISTICS MEDIUM RESOLUTION 10;
UPDATE STATISTICS MEDIUM RESOLUTION 10 .95;
{ RESOLUTION 10, CONFIDENCE .95}
UPDATE STATISTICS MEDIUM RESOLUTION 10 DISTRIBUTIONS ONLY;
UPDATE STATISTICS MEDIUM RESOLUTION 10 .95 DISTRIBUTIONS ONLY;

UPDATE STATISTICS HIGH;
UPDATE STATISTICS HIGH RESOLUTION 10;
UPDATE STATISTICS HIGH RESOLUTION 10 DISTRIBUTIONS ONLY;
解析度必须大于 0.005 并小于或等于 10.0。信任水平必须在 [0.80, 0.99](包括

功能说明
记录哈希键值与nodeid 的对应关系。在数据计算哈希时,首先通过哈希计算公式
(crc32() %65536)计算出哈希键值。然后,从gbase.nodedatamap 中查到对应的
nodeid。最后,在GCWare 存储的节点信息中,查找对应的数据分片信息,查找
的时候nodeid 为节点在GCWare 中存储的顺序。
表结构说明
表5- 285 表结构信息说明:




hashkey
哈希键值。范围0~65535
nodeid
表分片id。
从0 开始,
与分片一一对应关系。
可以通过gcadmin
showdistribution 查看segment id。
这里的nodeid = segment id - 1
Data_distribution_id
表数据分布信息的ID ,可以通过gcadmin
showdistribution 获得