返回首页

gbase数据、南大通用产品文档:GBase8s指定不透明类型的属性

更新日期:2024年09月11日

下列主题提供在 Java™ 类不存在时有关创建不透明类型的附加信息。有关从现有 Java 类
创建不透明类型的详细信息,请参阅 从现有代码创建不透明类型。

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

使用 UDTMetaData 类中的方法,可以为新的不透明类型指定属性。这些设置适用于新的不
透明类型;从现有文件创建不透明类型,请参阅从现有代码创建不透明类型.。
可以设置以下属性:

内部结构中定义不透明类型的字段数

其它属性,例如内部结构中定义不透明类型的每个字段的数据类型、名称和精度

不透明类型的长度

不透明类型的对齐方式

不透明类型和 JAR 文件的 SQL 名称

已生成的 Java 类的名称

是否保留生成的 .java 文件
指定字段计数
setFieldCount() 方法指定内部结构中定义不透明类型的字段计数:
public void setFieldCount(int fieldCount) throws SQLException
指定其它字段属性
以下方法设置内部数据结构中的字段的其它属性:
public void setFieldName (int field, String name) throws SQLException
public void setFieldType (int field, int ifxtype) throws SQLException
public void setFieldTypeName(int field, String sqltypename) throws SQLException
public void setFieldLength(int field, int length) throws SQLException
field 参数指示驱动程序应设置或获取属性的字段。第一个字段为 1;第二个字段为 2,依次
类推。
使用 setFieldName() 指定的名称出现在 Java™ 类文件中。以下示例将第一个字段名称设置
为 IMAGE。
mdata.setFieldName(1, "IMAGE");
setFieldType() 方法指示使用 com.gbasedbt.lang.IfxTypes 文件中的常量设置字段的数据类型。
有关更多信息,
请参阅映射字段类型。
以下示例指定第三个字段中的值为 CHAR 数据类型:

mdata.setFieldType(3, com.gbasedbt.lang.IfxTypes.IFX_TYPE_CHAR);
setFieldTypeName() 方法设置使用 SQL 数据类型名称的字段的数据类型:
mdata.setFieldTypeName(1, "IMAGE_UDT");
此方法仅对 opaque 和 distinct 类型有效;对于其它类型,驱动程序会忽略此信息。
length 参数具有以下含义,它取决于字段的数据类型:
字符类型

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

字符中的最大长度
DATETIME
编码的长度
INTERVAL
编码的长度
其它数据类型或不指定类型
驱动程序忽略此信息
编码长度的可能值为 JDBC 2.20 规范中的值:小时到秒;一年到两年;年份(1),年份
(2)到年份(5)。
以下示例指定不透明类型中的第三个字段(VARCHAR)不能存储多于 24 个字符:
mdata.setFieldLength(3, 24);
指定长度
setLength() 方法指定不透明类型的总长度:
public void setLength(int length) throws SQLException
如果您正在从现有的 Java™ 类创建不透明类型并不指定长度,则驱动程序创建可变长度的
不透明类型。
如果您从不具有现有的 Java 类创建不透明类型,
则必须指定长度;
在此情况
下,UDT Manager 只创建固定长度的不透明类型。
指定对齐方式
setAlignment() 方法指定不透明类型的对齐方式:
public void setAlignment(int alignment)
alignment 参数是下一节中显示的对齐值之一。如果未指定对齐方式,则数据库服务器设置
不透明类型 4 字节对齐。
对齐值
对齐值如下表所示。

常量
结构始于
边界对齐
1
SINGLE_BYTE
1 个字节的数量
单个字节
2
TWO_BYTE
2 个字节的数量(例如 SMALLINT)
2 个字节
4
FOUR_BYTE
4 个字节的数量(例如 FLOAT 或 UNSIGNED
INT)
4 个字节
8
EIGHT_BYTE
8 个字节的数量
8 个字节
指定 SQL 名称

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

使用 setSQLName() 和 setJarFileSQLName()方法指定 SQL 名称:
public void setSQLName(String name) throws SQLException
public void setJarFileSQLName(String name) throws SQLException
缺省情况下,驱动程序使用通过 setSQLName() 方法设置的名称作为当调
用 UDTManager.createUDTCclass() 和 UDTManager.createJar() 方法时生成的 JAR 文件和
Java™ 类的文件名称。例如,如果调用 setSQLName("circle") 然后调
用 createUDTCclass() 和 createJar(),则生成的类文件名将会是 circle.class ,JAR 文件名将
会是 circle.jar。可以通过调用 setClassName() 方法指定 Java 类文件名而不是缺省值。
JAR 文件 SQL 名称是驱动程序用于注册 UDR 的 SQL CREATE FUNCTION 语句中引
用的名称。
重要:
JAR 文件 SQL 名是 SQL 语句中 JAR 文件的名称;
它与 JAR 文件的内容没有关系。
指定 Java 类名称
使用 setClassName() 指定 Java™ 类名称:
public void setClassName(String name)throws SQLException
如果未使用 setClassName() 设置类名称,则驱动程序使用不透明类型的 SQL 名称(通
过 setSQLName() 设置)
和 createUDTCclass() 方法生成的.class 文件的名称作为 Java™ 类的
名称。
指定 Java 源文件保留
使用 keepJavaFile() 指定是否保留 .java 源文件:
public void keepJavaFile(boolean value)
value 值指示 createUDTClass() 方法是否应该保留它在为新的不透明类型创建 Java™ 类文
件时生成的 .java 文件。缺省为移除此文件。以下示例保留 .java 文件:
mdata.keepJavaFile(true);

所有者名称指定数据库对象的所有者。当您在语法图表中引用所有者名称时使用
本段。
语法
所有者名称

元素
描述
限制
语法
owner 数据库中对象所有者的
用户名
最大长度为 32 个
字节
必须遵守操作系统的规
则。
用法
在兼容 ANSI 的数据库中,必须指定您不拥有的数据库对象的所有者。在对数据
库对象的引用中,所有者名称的 ANSI/ISO 同义词时授权标识符。(然而,在对
模式对象的引用中, GBase 8s 文档调用的所有者名称的 ANSI/ISO 术语是模式
名称。)
在不兼容 ANSI 的数据库中,所有者名称是可选的。当创建数据库对象或用户数
据范围语句时,您不需要指定所有者。如果在创建数据库对象时不指定所有者,
那么在大多数情况下,数据库服务器将您的登录名指定为对象的所有者。 有关此
规则的例外,请参阅 CREATE FUNCTION 语句描述中的已创建数据库对象的所
有权和 CREATE PROCEDURE 语句描述中的创建数据库对象的所有权。当在所
有者特权 UDR 中的 DDL 语句创建一个新的数据库对象时,例程的所有者(而
非执行它的用户,如果此用户不是例程的所有者)成为新数据库对象的所有者。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1649
如果您在数据访问语句中指定所有者,那么数据服务器会检查它的正确性,不加
引号时,所有者是不区分大小写的。下面的四个查询都可以访问表 kaths.tab1
的数据:
SELECT * FROM tab1;
SELECT * FROM kaths.tab1;
SELECT * FROM KATHS.tab1;
SELECT * FROM Kaths.tab1;
在兼容 ANSI 的数据库中,只有表的所有者,用户 kaths,可以发出第一个示例
中的查询,其指定了一个未限定的表名,但是持有 tab1 上的 Select 特权的任何
用户可以在不兼容 ANSI 的数据库中发出该查询。有关在兼容 ANSI 数据库中所
有者名称的更多信息,请参阅符合 ANSI 的数据库的限制和区分大小写。
CREATE ROLE 语句声明的角色是授权标识符,因而会收到所有者名称的语法限
制,但是角色不能是数据库对象的所有者。同样,关键字 PUBLIC,它指定所有
用户的群组,不能是数据库对象的所有者,除了在特殊的 sysdbopen( ) 和
sysdbclose( ) 过程的情况中。有关这些内置会话配置 UDR 的更多信息,请参阅
会话配置过程。
使用引号
当使用引号时,所有者是区分大小写的。换句话说,引号指示数据库服务器在您
创建或访问数据库对象时,确切地按照输入读取或存储名称。例如,假设有一个
表,它的所有者是 Sam。可以使用下面两个语句中的任何一个来访问表中的数
据:
SELECT * FROM table1;
SELECT * FROM 'Sam'.table1;
第一个查询成功,因为不需要所有者名称。第二个查询成功,因为指定的所有者
名称和存储在数据库中的所有者名称匹配。
引用 gbasedbt 用户拥有的表
如果使用所有者名称作为从一个系统目录表访问数据库对象信息的选择条件,则
所有者名称是区分大小写的。要保留字母大小写,必须将所有者用单引号或双引
号括起来,并且必须完全按照其存储在系统目录表中的方式键入所有者名称。在
以下两个示例中,只有第二个成功访问表 Kaths.table1 上的信息。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1650
SELECT * FROM systables WHERE tabname = 'tab1' AND owner = 'kaths';
SELECT * FROM systables WHERE tabname = 'tab1' AND owner = 'Kaths';
用户 gbasedbt 是系统目录表的所有者。并且当 SQL 语句引用系统目录时,在
兼容 ANSI 的数据库中必须指定 gbasedbt 作为限定符,除非您是用户
gbasedbt:
SELECT * FROM "gbasedbt".systables WHERE tabname = 'tab1' AND owner =
'Kaths';
GBase 8s 接受以下任何符号,以指定符合 ANSI 的数据库的系统目录表:

"gbasedbt".system_table

gbasedbt.system_table

'gbasedbt'.system_table
然而,在这三种格式中,只有第一种,其中所有者被指定为定界标识符,可以与
大多数其它数据库服务器直接交互。对于不带分隔符的格式,SQL 的 ANSI/ISO
标准将小写字母升级为 GBASEDBT,同一标准不支持单引号(')作为所有者名称或
模式名称的有效分隔符。
相反, GBase 8s 将 gbasedbt 的名称视为一种特殊情况,并且在指定 gbasedbt
时保留小写字母,带或不带分隔符,无论数据库是否符合 ANSI。但是,要编写
可移植到非 GBase 8s 数据库服务器的 SQL 代码,应始终使用双引号(" )将
数据库对象的所有者名称分隔开。
以下 SQL 示例使用未定界的所有者名称:
CREATE TABLE gbasedbt.t1(i SERIAL NOT NULL);
CREATE TABLE someone.t1(i SERIAL NOT NULL);
如果这些语句成功执行,第一个表将在 systables 中注册的 gbasedbt 作为所有
者,第二个表将 SOMEONE 注册为所有者。当所有者的指定字母大小写,但所有
者名称未限定时,字母大小写无关紧要,因为 GBase 8s 将未分隔的所有者名称
变成大写,但将未定界的 gbasedbt (或 GBASEDBT)所有者名称变为小写的
gbasedbt。
例如,假设之前两个 CREATE TABLE 语句成功执行后,用户 gbasedbt 发出下
列语句:
CREATE TABLE GBASEDBT.t1(i SERIAL NOT NULL);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1651
该语句失败,因为所有者名称和表名称的组合不是唯一的,如果之前注册的
gbasedbt 用户拥有的表已经在数据库中存在。
提示: USER 操作符返回当前用户在系统上存储的登录名。如果所有者名称与登
录名不同(例如,混合大小写所有者名称和全小写登录名),则 owner = USER
语法失败。
符合 ANSI 的数据库的限制和区分大小写
下表描述了当您创建、重命名或访问数据库对象时数据库服务器如何读取和存储
所有者。
所有者名称规范
兼容 ANSI 的数据库的做法
忽略
严格按照登录名存储在系统中的方式读取或存储所有者,但
如果用户不是所有者,则会返回错误。
不带引号指定
以大写字母读取或存储所有者
包括在引号中
完全按照输入读取或存储所有者 。另见使用引号和引用
gbasedbt 用户拥有的表。
如果在兼容 ANSI 的数据库中创建或重命名数据库对象时指定所有者名称,必须
在数据访问语句中包含所有者名称。当访问不属于您的数据库对象时您必须包含
所有者名称。
因为如果所有者不在引号之间,则数据库服务器自动将所有者转换为大写字母,
区分大小写错误会导致查询失败。例如,如果您是用户 nancy 并且使用以下语
句,则产生的视图具有名称 nancy.njcust:
CREATE VIEW 'nancy'.njcust AS
SELECT fname, lname FROM customer WHERE state = 'NJ';
以下 SELECT 语句失败,因为它试图将 NANCY.njcust 和实际所有者和表名
nancy.njcust 相匹配:
SELECT * FROM nancy.njcust;
在 GBase 8s 分布式查询中,如果所有者名称不在引号中,则远程数据库遵循本
地数据库的大小写约定。如果本地数据库是兼容 ANSI 的,则远程数据库将所有
者名称处理为 uppercase。如果本地数据库是不兼容 ANSI 的,则远程数据库将
所有者名称处理为 lowercase。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1652
提示: 使用所有者名称作为查询中的选择标准之一(例如,WHERE owner =
'kaths')时,必须确保带引号字符串和存储在数据库中的所有者名称完全匹配。
如果数据库服务器找不到数据库对象或数据库,可能需要修改查询使引用字符串
使用大写字母(例如,WHERE owner = 'KATHS')。
因为所有者名称是授权标识符,而不是 SQL 标识符,因此可以在数据库的 SQL
语句中的单引号(')之间包含所有者,其中 DELIMIDENT 环境变量指定支持分
隔标识符,从而需要双引号(")围绕 SQL 标识符。
为兼容 ANSI 的数据库设置 ANSIOWNER
兼容 ANSI 的数据库的缺省行为是将在任何 owner 规范中的所有不在引号中的
小写字母替换为大写字母。可以通过在数据库服务器初始化之前设置
ANSIOWNER 环境变量为 1 ,来阻止这个行为。这将保持您在不加引号指定
owner 字符串时所使用的任意大小写形式。
缺省所有者名称
如果您在不符合 ANSI 的数据库中创建数据库对象时未显式地指定所有者名称,
则您的授权标识符(作为对象的缺省所有者)将存储到数据库的系统目录中,如
同您已经加上引号指定您的授权标识(即,保持大小写形式)。
如果您在符合 ANSI 的数据库中创建建数据库对象时未显式地指定所有者名称,
则您的授权标识符(作为对象的缺省所有者)将以大写字符存储到数据库的系统
目录中,除非 ANSIOWNER 环境变量在数据库服务器初始化之前已设置为
1 。但如果 ANSIOWNER 已设置为 1 ,则数据库服务器将存储对象的缺省所
有者作为您的授权标识符,保持其大小写形式。
所有者名称的大小写形式规则总结
要创建数据库对象,例如名为 mytab 的表,登录名为 Otho 的用户可以以下列几
种方式声明新数据库对象的名称:
1. CREATE TABLE mytab . . .
2. CREATE TABLE Otho.mytab . . .
3. CREATE TABLE "Otho".mytab . . .

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1653
未分隔的所有者名称(第二个示例中)存储在 systables 系统目录表的 owner
列的形式取决于本地数据库是否符合 ANSI 。

在情况 1 中,未指定所有者名称。表的隐式所有者是 Otho,创建该表的
用户,并且所有者名称以与所有者的用户标识相同的格式(Otho)存储在
systables 表中,与数据库的 ANSI 兼容状态无关。

在情况 2 中,指定未定界的所有者名称。systables 表对于不符合 ANSI
的数据库的数据库,将所有所有者名称字母存储为小写(此处为
otho)。对于兼容 ANSI 的数据库(其中不将 ANSIOWNER 设置为
1), systables 表将所有所有者名称字母存储为大写(此处为
OTHO)。但是,如果 ANSIOWNER 设置为 1,则名称以与 DDL 语
句中指定的相同大小写形式存储(此处为 Otho)。

在情况 3 中,定界的所有者名称按照其指定的相同的形式(此处为
Otho)存储在 systables 表中,与数据库的 ANSI 兼容状态无关。
请注意用户标识符是区分大小写的,但是数据库名称不区分大小写。因此,同一
个用户不能用于表 tab 和表 TAB 。
除了这些示例中的 CREATE TABLE 语句之外,所有 SQL 语句和 SPL 语句都
遵循这些规则。例如,使用 DROP TABLE 时,在处理语句时所有者名称出现的
格式取决于以下相同的条件:

是否指定了显式所有者名称。

如果指定了显式所有者名称,是否使用引号将所有者名称分隔开。

如果没有使用引号将显式所有者名称分隔开,则数据库是否符合 ANSI 标
准。

如果数据库是符合 ANSI 的,则在数据库初始化之前是否将
ANSIOWNER 设置为 1。

这部分包含有关创建具有和不具有缺省页大小的标准和临时数据库空间的信息,创建数据
库空间时在数据库空间中为表空间 tblspace 指定第一个和下一个扩展数据块大小的信息,
以及向数据库空间或 BLOB 空间添加块的信息。
有关监视数据库空间的信息,请参阅监视存储空间。

创建使用缺省页大小的数据库空间
可以使用 onspaces 或 ON-Monitor 创建标准数据库空间和临时数据库空间。
有关创建具有非缺省页大小的数据库空间的信息,请参阅创建具有非缺省页大小的数据库
空间。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 197 -
任何新添加的数据库空间及其镜像(如果存在一个镜像)立即可用。如果您使用镜像,那
么可在创建数据库空间时对其制作镜像。镜像可立即生效。
要使用 onspaces 创建标准数据库空间:
1.
在 UNIX™ 上,您必须以用户 gbasedbt 或 root 身份登录来创建数据库空间。
2.
请确保数据库服务器处于联机、管理或静默方式中。
3.
按分配磁盘空间中所述,为数据库空间分配磁盘空间。
4.
要创建数据库空间,请使用 onspaces -c -d 选项。
KB 是 -s size 和 -o offset 选项的缺省单位。 要将 KB 转换为 MB,可将该单位
数量乘以 1024(例如,10 MB = 10 * 1024 KB)。
如果要创建具有非缺省页大小的数据库空间,请参阅创建具有非缺省页大小的数据
库空间以获取有关附加 onspaces 选项的信息。
5.
如果不想为数据库空间中的表空间 tblspace 指定第一个和下一个扩展数据块大
小,请转至 6。
如果想要为数据库空间中的表空间 tblspace 指定第一个和下一个扩展数据块大
小,
表空间为表空间 tblspace 指定第一个和下一个扩展数据块大小中的其他信息。

6.
在创建数据库空间之后,必须对根数据库空间和新数据库空间执行 0 级备份。
以下示例显示了如何在 UNIX 上使用原始磁盘空间创建 10 MB 镜像数据库空间
dbspce1,对主块和镜像块的偏移量均为 5000 KB。
onspaces -c -d dbspce1 -p /dev/raw_dev1 -o 5000 -s 10240 -m /dev/raw_dev2 5000
有关使用 onspaces 创建数据库空间的更多信息,请参阅数据库空间和《GBase 8s 管理员
参考》中有关 onspaces 的信息。
要使用 ON-Monitor 创建数据库空间 (UNIX):
1. 选择数据库空间 > 创建选项。
2. 在字段数据库空间名称中输入新数据库空间的名称。
3. 如果您希望为初始数据库空间块创建镜像,
请在镜像字段中输入 Y。
否则,
输入 N。

4. 如果您正在创建的数据库空间是临时数据库空间,请在临时字段输入 Y。 否则,
输入 N。
5. 如果要为标准数据库空间指定页大小,请在页大小字段中输入大小(以 KB 计)。
大小必须为根数据库空间页大小的倍数。有关指定页大小的更多信息,请参阅创建
具有非缺省页大小的数据库空间。
数据库空间内的所有表、索引以及其他对象都将使用指定大小的页。
6. 在主块部分的完整路径名字段中输入数据库空间初始主块的完整路径名。
7. 在偏移量字段中指定偏移量。
8. 在大小字段中输入块的大小(以 KB 计)。
9. 如果要对该数据库空间制作镜像,请在屏幕的镜像块部分输入完整路径名、大小和
(可选)偏移量。
有关更多信息,请参阅《GBase 8s 管理员参考》中的 ON-Monitor 主题。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 198 -
为表空间 tblspace 指定第一个和下一个扩展数据块大小
如果要减少表空间 tblspace 扩展数据块数,并降低发生必须将表空间 tblspace 扩展数据
块放入非主块的情况的频率,可以指定第一个和下一个扩展数据块大小。 (主块为数据库
空间中的初始块。)
可选择性地指定第一个扩展数据块大小、下一个扩展数据块大小,以及第一个和/或下一个
扩展数据块大小。如果不为表空间 tblspace 指定第一个或下一个扩展数据块大小,那么
GBase 8s 将使用现有的缺省扩展数据块大小。
可使用 TBLTBLFIRST 和 TBLTBLNEXT 配置参数为表空间 tblspace指定第一个或下一
个扩展数据块大小,该表空间位于在初始化服务器时创建的根数据库空间中。
可使用 onspaces 实用程序为非根数据库表空间中的表空间 tblspace 指定第一个和下一个
扩展数据块大小。
创建数据库空间时,可以仅指定第一个和下一个扩展数据块大小。创建数据库空间后,不
能改变第一个和下一个扩展数据块大小的规范。另外,您还不能指定临时数据库空间、智
能大对象空间、BLOB 空间或外部空间的扩展数据块大小。创建数据库空间之后,您将无
法改变第一个和下一个扩展数据块大小的规格。
要指定第一个和下一个扩展数据块大小,请执行以下操作:
1. 确定在表空间 tblspace 中所需的总页数。
页数等于表数 + 拆离索引数 + 可能位于数据库空间中的表分段数 + 表空间 tblspace 的一个
页面。
2. 计算页数所需的 KB 数。
此数字将取决于系统上的一个页面的 KB 数。
3. 通过考虑在创建数据库空间期间分配的表空间 tblspace 的所有扩展数据块的重要
性,以及是否必须连续分配这些扩展数据块来确定系统上的空间管理需求。
其中,最重要的就是第一个扩展数据块大小必须更大。如果不是很在意辅助块中存在不连 续扩
展数据块,那么第一个和下一个扩展数据块大小可以小一些。
4. 如下所示,指定扩展数据块大小:
o
如果空间需求适用于根数据库空间,那么在 TBLTBLFIRST 配置参数中指定第一个扩
展数据块大小并在 TBLTBLNEXT 配置参数中指定下一个扩展数据块大小。 然后初始化数
据库服务器实例。
o
如果空间需求适用于非根数据库空间,
那么通过使用 onspaces实用程序在命令行上指示
第一个和下一个扩展数据块大小从而创建数据库空间。
扩展数据块大小必须以 KB 计,并且必须是页大小的倍数。指定第一个和下一个扩展数据
块大小时,请遵循以下指南:
扩展数据块的类型
最小大小
最大大小

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 199 -
扩展数据块的类型
最小大小
最大大小
非根数据库空间中的第一个
扩展数据块
相当于 50 页(以 KB 指
定)。这是系统缺省值。 例
如,
对于 2 KB 页面系统,

小长度为 100。
初始块的大小,
减去任何系统
对象
(如保留页、
数据库表空
间,
以及物理和逻辑日志)

需的空间。
根数据库空间中的第一个扩
展数据块
相当于 250 页(以 KB 指
定)。这是系统缺省值。
初始块的大小,
减去任何系统
对象
(如保留页、
数据库表空
间,
以及物理和逻辑日志)

需的空间。
下一个扩展数据块
为系统上磁盘页大小的 4
倍。 在任何类型的数据库空
间上,缺省值均为 50 页。
最大块大小减去 3 页。
可使用以下 onspaces 实用程序和-ef 和 -en 选项为非根数据库表空间中的表空间
tblspace 指定第一个和下一个扩展数据块大小:

第一个扩展数据块大小:-ef size_in_kbytes

下一个扩展数据块大小:-en size_in_kbytes
例如,可以指定:
onspaces -c -d dbspace1 -p /usr/data/dbspace1 -o 0 -s 1000000 -e 2000 -n 1000
可使用 Oncheck -pt 和 oncheck -pT显示表空间 tblspace 的第一个和下一个扩展数据块大
小。
如果正在使用数据复制并且在主数据库服务器上创建了数据库空间,那么第一个和下一个
扩展数据块大小将通过 ADDCHK 日志记录传递到辅助数据库服务器。
有关 onspaces 实用程序、oncheck 命令以及为表空间 tblspace 指定第一个和下一个扩展
数据块大小的更多信息,请参阅《GBase 8s 管理员参考》。

创建具有非缺省页大小的数据库空间
如果需要的密钥长度比缺省页大小可提供的更长,那么可以指定标准或临时数据库空间的
页大小。
根数据库空间为缺省页大小。如果要指定页大小,该大小必须为缺省页大小的整数倍,且
不能超过 16 KB。
对于具有足够存储空间的系统,较大页大小的性能优势包括:

减少 B 型树索引的深度(甚至对于较小的索引键)。

减少检查点时间(通常出现在使用较大页大小时)。
其他的性能优势还体现在您可以:

将当前跨多个页(大小为缺省页大小)的长行分组到同一页上。

定义临时表的不同页大小,这样临时表具有单独的缓冲池。
使用 BUFFERPOOL 配置参数可创建与数据库空间的页大小相对应的缓冲池。(您可能想
要执行此操作来实现一种“专用缓冲池”。)

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 200 -
一个表可在一个数据库空间中,而该表的索引可在另一个数据库空间中。这些分区的页大
小可以不同。
如果想要为数据库空间指定页大小,请指向以下任务:
1. 请运行 onmode -BC 2命令来启用大块方式。
缺省情况下,首次初始化或重新启动 GBase 8s 时,将启动 GBase 8s,并启用大块
方式。有关 onmode 实用程序的信息,请参阅《GBase 8s 管理员参考》。
2. 创建对应于数据库空间页大小的缓冲池。可使用 onparams实用程序或
BUFFERPOOL 配置参数。必须在创建数据库空间之前执行此操作。
如果创建的数据库空间其页大小没有对应的缓冲池,那么 GBase 8s 将使用在
onconfig 配置文件中定义的缺省参数自动创建缓冲池。
无法使多个缓冲池具体相同的页大小。
3. 创建数据库空间时,定义数据库空间的页大小。可使用 onspaces 实用程序或
ON-Monitor。有关更多信息,请参阅定义页大小。
例如,如果创建页大小为 6 KB 的数据库空间,那么必须创建大小为 6 KB 的缓冲池。如
果没有为新的缓冲池指定页大小,那么 GBase 8s会将操作系统缺省页大小(在大多数
UNIX™ 平台上为 2 KB)用作缓冲池的缺省页大小。
提示: 如果使用非缺省页大小,可能需要增大物理日志的大小。如果对非缺省页执行许多更新,那么可
能需要将物理日志大小增大 150% 到 200%。要调整物理日志,可能需要进行一些试验。可根据物理日志
触发器检查点的填充频率来按需调整物理日志的大小。
为非缺省页大小创建缓冲池
创建缓冲池时,可使用 BUFFERPOOL 配置参数或 onparams 实用程序来指定有关缓冲区
的信息(包括其大小)、指定缓冲池中 LRUS 的数量、指定缓冲池中缓冲区的数量,以及
的 lru_min_dirty 和 lru_max_dirty值。
使用 BUFFERPOOL 配置参数指定此信息。
BUFFERPOOL 配置参数由 onconfig.std 文件中的两行组成。
在 UNIX™ 系统上,这些行是:
BUFFERPOOL default,buffers=10000,lrus=8,lru_min_dirty=50.00,lru_max_dirty=60.50
BUFFERPOOL size=2K,buffers=50000,lrus=8,lru_min_dirty=50,lru_max_dirty=60
第一行指定了使用的缺省值,这些值是当您创建的数据库空间的页大小没有对应在启动数
据库服务器时创建的缓冲池时被使用的。缺省行之后的以下行指定了缓冲池的数据库服务
器缺省值。 这些值以数据库服务器的缺省页大小为依据。
使用 onspaces 实用程序添加具有不同页大小的数据库空间时,
或者使用 onparams 实用程
序添加新的缓冲池时,将向 onconfig 文件的 BUFFERPOOL 配置参数添加一个新行。每
个缓冲池的页大小必须为您操作系统缺省页大小的倍数。以下示例显示了添加到 onconfig
文件中的第三个 BUFFERPOOL 行:

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 201 -
BUFFERPOOL default,buffers=10000,lrus=8,lru_min_dirty=50.00,lru_max_dirty=60.50
BUFFERPOOL size=2K,buffers=50000,lrus=8,lru_min_dirty=50,lru_max_dirty=60
BUFFERPOOL size=6K,buffers=3000,lrus=8,lru_min_dirty=50,lru_max_dirty=60
BUFFERPOOL 行中的字段不区分大小写,所以您可以指定 lrus、Lrus 或 LRUS)。这些
字段可按任何顺序显示。
如果没有为新的缓冲池指定页大小,那么 GBase 8s会将操作系统缺省页大小用作缓冲池的
缺省页大小。
如果 buffers 的值为零 (0),或者在 BUFFERPOOL 配置参数中缺少 buffers 的值,那么
GBase 8s 不会创建指定页大小的缓冲池。
重要: 使用BUFFERPOOL 配置参数输入的信息将取代先前使用不推荐的参数指定的任何信息。有关不
推荐的参数的更多信息,请参阅附录,其中包含《GBase 8s 管理员参考》中已终止的配置参数的信息。
下表为您使用 BUFFERPOOL 配置参数或 onparams 实用程序指定的值提供了说明。
字段
解释
值范围
size
指定页面中后跟后缀 K 的 KB 数。
大小可在 2K 或 4K 至 16 K
之间变化。2K 为缺省值。
buffers
指定页大小缓冲区的数量。
这是数据库服务器用户线程代表客户机
应用程序用于磁盘 I/O 的共享内存缓
冲区的最大数目。数据库服务器所需的
缓冲区数取决于应用程序。
例如,如果数据库服务器用了 90% 的时
间访问了 15% 的应用程序数据,那么必
须分配足够的缓冲区以保留该 15% 的
数据。增加缓冲区数量可提高系统性能。

缓冲区空间所需的物理内存百分比取决
于计算机上可用的内存量,以及用于其
他应用程序的内存量。对于具有大量可
用物理内存(4 千兆字节或以上)的系
统,缓冲区空间可达到物理内存的 90%。
对于可用物理内存量较小的系统,缓冲
区空间的范围可以为物理内存的 20%
到 25%。
必须在设置缓冲区空间 (buffers
*system_page_size) 后计算所有其他
的共享内存参数。
对于 UNIX 上的 32 位平台

页大小等于 2048 字
节:100 到 1,843,200 个缓
冲区 (1843200 = 1800 *
1024)

页大小等于 4096 字
节:
100 到 921,600 个缓冲
区 (921,600 = ((1800 *
1024)/4096) * 2048 )
对于 64 位平台:100 到 2
31-1
个缓冲区
(对于 64 位平台的实
际值,
请参阅发行说明。
Solaris
上缓冲区的最 大数为
536,870,912。)
lrus
在共享内存缓冲池中为页大小指定
LRU(最近最少使用的)队列的数目。
可调整 LRUS、lru_min_dirty 和
lru_max_dirty 值以控制共享内存缓冲
1 到 128

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 202 -
字段
解释
值范围
区每隔多少时间清空到磁盘一次。
将 LRUS 设置得过高可能导致页清除程
序活动过多。
lru_min_dirty 指定已修改的页占 LRU 队列的百分
比,达到该百分比时页清除将不再是必
需的。在某些情况下,页清除程序可能
会超出该点继续清除。
用于清空检查点之间缓冲池的 LRU 值
对于检查点性能不是特别重要。
lru_min_dirty 值通常仅对于维持足够
数量的干净页以供替换而言是必要的。
通过设置 LRU 清空参数以将
lru_min_dirty 设置为 70 来启动。
有关更多信息,请参阅用于清空检查点
之间缓冲池的 LRU 值。
0 到 100(允许小数值)
如果超过值的范围指定参数,

么缺省值将被设置为 50.00%。

lru_max_dirty 指定已修改页占 LRU 队列的百分比,
达到该百分比时将清除队列。
用于清空检查点之间缓冲池的 LRU 值
对于检查点性能不是特别重要。
lru_max_dirty 值通常仅在维持足够数
量的干净页以供替换时才显得必要。通
过设置 LRU 清空参数以将
lru_max_dirty 设置为 80 来启动。
有关更多信息,请参阅用于清空检查点
之间缓冲池的 LRU 值。
0 到 100(允许小数值)
如果超过值的范围指定参数,

么缺省值将被设置为60.00%。
如果数据库服务器处于联机、静默或管理方式,那么您还可以使用 onparams 实用程序添
加不同大小的新缓冲池。使用 onparams 实用程序时,指定的信息将自动传输到 onconfig
文件的,并且会使用 BUFFERPOOL 关键字指定新值。不能通过编辑onconfig.std 文件更
改值。
当您使用 onparams 实用程序时,请如下指定信息:
onparams -b -g -n
-r -x
-m
例如:
onparams -b -g 6 -n 3000 -r 2 -x 2.0 -m 1.0
这添加了 3000 个大小为 6K 字节的缓冲区,每个缓冲区都具体 2 个 LRUS 并且
lru_max_dirty 被设置为 2%,而且lru_min_dirty 被设置为 1%。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 203 -
有关 onparams 实用程序的更多信息,请参阅《GBase 8s 管理员参考》。
建议: 将 PHYSBUFF 配置参数至少设置为 128 KB。如果数据库服务器已配置为使用
RTO_SERVER_RESTART,请将 PHYSBUFF 配置参数至少设置为 512 KB。将 PHYSBUFF 设置为较低
的值可能会影响事务性能以及/或者导致服务器初始化期间出现性能警告。
LG_ADDBPOOL 日志记录和 sysbufpool 系统目录表包含有关每个缓冲池的信息。
当数据库服务器正在运行时添加的缓冲池将会进入虚拟内存而不是常驻内存中。根据正在
使用的内存的可用性,
仅在启动时在 onconfig 文件中指定的那些缓冲池条目会进入常驻内
存。
调整现有缓冲池大小
如果必须调整现有缓冲池的大小,必须关闭数据库服务器。然后在 onconfig 文件中更改缓
冲池的大小。
删除现有缓冲池
如果必须删除现有缓冲池,必须关闭数据库服务器。然后在 onconfig 文件中删除缓冲池。

定义页大小
可以使用 onspaces -k 选项或 ON-Monitor 以定义页大小。
如下所示设置页大小(以 KB 为单位):
onspaces -c -d DBspace [-t] [-k pagesize] -p path -o offset -s size [-m path offset]
根数据库空间为缺省页大小。
如果指定页大小,页大小必须是缺省页大小的倍数,且不能超过 16 KB。
如果使用 ON-Monitor 创建数据库空间,
请确保在页大小字段中输入页大小
(以 KB 计)



通过使用直接 I/O 提高熟文件数据库空间的性能
在 UNIX™ 系统上,可通过使用直接 I/O 提高用于数据库空间块的熟文件的性能。
直接 I/O 必须可用并且文件系统必须支持用于数据库空间块的页大小的直接 I/O。
可以使用 GBase 8s 将原始设备或熟文件用于数据库空间块。通常,熟文件会较慢,因为
存在文件系统提供的额外开销和缓存。直接 I/O 绕过文件系统缓冲区的使用,因此对磁盘
的读写效率更高。使用 DIRECT_IO 配置参数指定直接 I/O。如果文件系统支持用于数据
库空间块的页大小的直接 I/O 并使用直接 I/O,那么熟文件的性能可能接近用于数据库空
间块的原始设备的性能。
要通过使用直接 I/O 提高熟文件数据库空间的性能,请执行以下操作:
1. 验证您是否具有直接 I/O 且文件系统是否对用于数据库空间块的页大小支持直接
I/O。
2. 通过将 DIRECT_IO 配置参数设置为 1 启用直接 I/O。
如果有 AIX® 操作系统,那么还可以为 GBase 8s 启用并行 I/O,以在对使用熟文件的块
执行读写时将其与直接 IO 一起使用。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 204 -
有关使用直接 IO 或并发 IO 的更多信息,请参阅《GBase 8s 性能指南》。

将多个指定分段存储在单个数据库空间
对于使用基于表达式的分布方案或循环分布方案的分段表,可以创建可位于单个数据库空
间中的指定分段。
对于使用基于表达式、时间间隔、列表或循环法的分布方案的分段表,可以创建可位于单
个数据库空间中的指定分段。
将多个表或索引段存储到一个数据库空间中时的查询性能要优于将每个段存储到不同数据
库空间中时的查询性能,并且简化了数据库空间的管理。
假设您要使用基于表达式的分布方案创建分段表,该分布方案中的每个表达式都会指定放
置在特定分段中的数据集。您可决定使用某个数据库空间中某个月的 数据以及其他的 11
个数据库空间中的 11 个月的数据分割表中的数据。然而,如果要对所有年度数据仅使用
一个数据库空间,那么可以创建指定分段,使每个月的数据存储在一个数据库空间中。
如果创建具有指定分段的分段表,sysfragments 系统目录中每行的分区列中都会包含分段
名称。
如果创建没有指定分段的分段表,
那么数据库空间的名称位于分区列中。
sysfragments
目录中的标志列告诉您分段存储方案中是否具有指定分段。
可以创建具有指定分段的表和索引,并且可以使用 PARTITION 关键字和分段名称创建、
删除和修改指定分段。
要创建具有指定分段的分段表,请如以下示例中所示使用 SQL 语法:
CREATE TABLE tb1(a int)
FRAGMENT BY EXPRESSION
PARTITION part1 (a >=0 AND a < 5) IN dbspace1,
PARTITION part2 (a >=5 AND a < 10) IN dbspace1
...
;
如果创建的表或索引分段包含指定分段,那么在使用 ALTER FRAGMENT 语句时必须使
用包含指定分段名称的语法,如以下示例中所示:
ALTER FRAGMENT ON TABLE tb1 INIT FRAGMENT BY EXPRESSION
PARTITION part_1 (a >=0 AND a < 5) IN dbspace1,
PARTITION part_2 (a >=5 AND a < 10) IN dbspace1;
ALTER FRAGMENT ON INDEX ind1 INIT FRAGMENT BY EXPRESSION
PARTITION part_1 (a >=0 AND a < 5) IN dbspace1,
PARTITION part_2 (a >=5 AND a < 10) IN dbspace1;
按此示例中所示,可使用 PARTITION BY EXPRESSION 子句替代 CREATE TABLE、
CREATE INDEX 和 ALTER FRAGMENT ON INDEX 语句中的 FRAGMENT BY
EXPRESSION 子句:

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 205 -
ALTER FRAGMENT ON INDEX idx1 INIT PARTITION BY EXPRESSION
PARTITION part1 (a <= 10) IN idxdbspc1,
PARTITION part2 (a <= 20) IN idxdbspc1,
PARTITION part3 (a <= 30) IN idxdbspc1;
使用 ALTER FRAGMENT 语法将不具有指定分段的分段表和索引更改为具有指定分段的
表和索引。以下语法显示了如何可将具有多个数据库空间的分段表转换为具有指定分段的
分段表:
CREATE TABLE t1 (c1 int) FRAGMENT BY EXPRESSION
(c1=10) IN dbs1,
(c1=20) IN dbs2;
ALTER FRAGMENT ON TABLE t1 MODIFY dbs2 TO PARTITION part_3 (c1=20)
IN dbs1
以下语法显示了如何可将分段索引转换为包含指定分段的索引:
CREATE TABLE t1 (c1 int) FRAGMENT BY EXPRESSION
(c1=10) IN dbs1, (c1=20) IN dbs2, (c1=30) IN dbs3
CREATE INDEX ind1 ON t1 (c1) FRAGMENT BY EXPRESSION
(c1=10) IN dbs1, (c1=20) IN dbs2, (c1=30) IN dbs3
ALTER FRAGMENT ON INDEX ind1 INIT FRAGMENT BY EXPRESSION
PARTITION part_1 (c1=10) IN dbs1, PARTITION part_2 (c1=20) IN dbs1,
PARTITION part_3 (c1=30) IN dbs1,
请参阅《GBase 8s 性能指南》以获取有关分段存储的更多信息,包括分段存储指南、分段
索引的过程、创建具有指定分段的连接和拆离索引的过程,以及用于创建包含指定分段的
连接和拆离索引的 SQL 语句的示例。
请参阅
《GBase 8s SQL 指南:
语法》
以获取更多的语法详细信息,
包括 GRANT FRAGMENT
和 REVOKE FRAGMENT 语句中有关指定分段的信息以及有关使用 ALTER FRAGMENT
语句的 DROP、DETACH 和 MODIFY 子句的详细信息。

创建临时数据库空间
要指定分配临时文件的位置,请创建临时数据库空间。
要定义临时数据库空间,请执行以下操作:
1. 使用带 -c -d -t 选项的 onspaces 实用程序。
有关更多信息,请参阅创建使用缺省页大小的数据库空间。
2. 使用 DBSPACETEMP 环境变量或配置参数可指定数据库服务器可用于临时存储
器的数据库空间。
DBSPACETEMP 配置参数可包含非缺省页大小的数据库空间。虽然可在 DBSPACETEMP
的参数列表中包含页大小不同的各个数据库空间,但数据库服务器只会使用页大小
和所列出的第一个数据库空间的页大小相同的数据库空间。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 206 -
有关 DBSPACETEMP 的更多信息,请参阅 GBase 8s 管理员参考 中有关配置参数的
主题。
3. 如果创建了多个临时数据库空间,
那么这些数据库空间必须位于不同磁盘上以优化
I/O。
如果要创建临时数据库空间,那么必须通过设置 DBSPACETEMP 配置参数和/或
DBSPACETEMP 环境变量让数据库服务器知道存在新创建的临时数据库空间。
数据库服务
器直至您采取以下两个步骤之后才开始使用临时数据库空间:

设置 DBSPACETEMP 配置参数和/或 DBSPACETEMP 环境变量。

重新启动数据库服务器。
以下示例显示了如何创建名为 temp_space 的 5 MB 临时数据库空间,偏移量为 5000
KB:
onspaces -c -t -d temp_space -p /dev/raw_dev1 -o 5000 -s 5120
有关更多信息,请参阅临时数据库空间。

磁盘空间不足时应执行的操作
当您正在创建的数据库空间的初始块是熟文件(在 UNIX™ 上)时,数据库服务器会验证
磁盘空间是否足够用于该初始块。如果块大小大于磁盘上的可用空间,将显示消息且不会
创建任何数据库空间。但是,未除去数据库服务器为初始块创建的熟文件。它的大小表示
在您创建数据库空间之前文件系统上剩余的空间。 除去该文件以回收该空间。

向数据库空间或 BLOB 空间添加块
当数据库空间、BLOB 空间或智能大对象空间将满或需要更多磁盘空间时添加块。
重要: 新添加的块及其相关联的镜像(如果存在一个镜像)立即可用。如果您正向已镜像的存
储空间添加块,那么必须还添加镜像块。
要使用 onspaces 添加块,请执行以下操作:
1. 在 UNIX™ 上,必须以用户 gbasedbt 或 root 身份登录来添加块。
2. 请确保数据库服务器处于联机、管理或静默方式,或快速恢复方式的清除阶段。
3. 按分配磁盘空间中所述,为块分配磁盘空间。
4. 要添加块,请使用 onspaces 的 -a 选项。
如果存储空间已镜像,那么必须为主块和镜像块都指定路径名。
如果指定了不正确的路径名、偏移量或大小,那么数据库服务器不会创建块,并且
会显示错误消息。另见磁盘空间不足时应执行的操作。
5. 在创建块之后,
必须对根数据库空间和包含该块的数据库空间、
BLOB 空间或智能
大对象空间执行 0 级备份。
以下示例将 10 兆字节的镜像块添加至 blobsp3。对主块和镜像块都指定了 200 KB 的偏
移量。如果您不添加镜像块,那么可省略 -m 选项。
onspaces -a blobsp3 -p /dev/raw_dev1 -o 200 -s 10240 -m /dev/raw_dev2 200
下一个示例以 5200 KB 的偏移量向数据库空间 dbspc3 添加 5 MB 的原始磁盘空间块。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 207 -
onspaces -a dbspc3 \\.\e: -o 5200 -s 5120
还可以定义当应用程序需要更多存储空间时,GBase 8s 可用于自动扩展块大小的信息。如
果有可扩展块,那么无需添加新块或耗费时间来尝试确定哪种存储空间(数据库空间、临
时数据库空间、智能大对象空间、临时智能大对象空间或 BLOB 空间)将耗尽空间,以及
何时将耗尽空间。
当启用 CHUNK_OVERLAP_PROTECTION 配置参数时,数据库服务器将确保新块不会与
其他块重叠。如果服务器发现块重叠,新块添加操作将失败。
使用 ON-Monitor 添加块 (UNIX™)
可以使用 ON-Monitor 将块添加到数据库空间。
要向数据库空间添加块,请遵循以下指示信息:
1. 选择添加块 > 数据库空间选项。
2. 使用 Enter 键或方向键来选择将接收新块的 BLOB 空间或数据库空间,并按
CTRL-B 或 F3 键。
3. 下一屏幕指示是否对 BLOB 空间或数据库空间制作镜像。如果是,那么在镜像字
段中输入 Y。
4. 如果您要向其中添加块的数据库空间是临时数据库空间,请在临时字段中输入 Y。

5. 如果您指示对数据库空间或 BLOB 空间制作镜像,那么主块和镜像块都必须要指
定。
在主块部分的完整路径名字段中输入新主块的完整路径名。
6. 在偏移量字段中指定偏移量。
7. 在大小字段中输入块的大小(以 KB 计)。
8. 如果要对该块制作镜像,
请在屏幕的镜像块部分中输入完整路径名、
大小和
(可选)
偏移量。

重命名数据库空间
如果您是用户 gbasedbt 或者具有 DBA 特权,
并且数据库服务器处于静默方式
(不是其他
方式),那么可使用 onspaces 实用程序来重命名数据库空间。
要重命名数据库空间,请使用以下 onspaces 实用程序命令:
onspaces -ren old_dbspace_name-n new_dbspace_name
可重命名标准数据库空间和所有其他空间,包括 BLOB 空间、智能 BLOB 空间、临时空
间和外部空间。然而,您无法重命名任何关键数据库空间,比如根数据库空间或包含物理
日志的数据库空间。
可重命名数据库空间和智能大对象空间:

启用了 Enterprise Replication 时

启动数据复制时,在主数据库服务器上
无法在辅助数据库服务器上或者当辅助数据库服务器为 Enterprise Replication 配置的一部
分时重命名数据库空间和智能大对象空间

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 208 -
重命名数据库空间操作仅更改数据库空间名称;它不会重新组织数据。
重命名数据库空间命名更新所有存储该名称位置处的数据库空间名称。
这包含磁盘上 的保
留页、系统目录、ONCONFIG 配置文件和内存内数据结构。
重要: 重命名数据库空间后,对重命名的根数据库空间和根数据库空间执行 0 级归档。有关信息,请参
阅《GBase 8s 备份与复原指南》。
重命名数据库空间之后可能需要执行的其他操作
如果重命名数据库空间,必须重新写入和重新编译引用旧数据库空间名称的所有存储过程
代码。 例如,如果您的存储过程包含 ALTER FRAGMENT 关键字并引用了数据库空间名
称,那么必须重新写入和重新编译该存储过程。
如果您重命名在 DATASKIP 配置参数中指定的数据库空间,那么您必须在重命名数据库
空间后手动更新 DATASKIP 配置参数。