返回首页

gbase数据、南大通用产品文档:GBase8s配置操作系统

更新日期:2024年09月11日

在可以开始配置数据库服务器之前,必须适当地配置操作系统。为此,您可能需要系统管
理员的帮助。
GBase 8s 的 32 位版本可以运行在 64 位或 32 位操作系统上。GBase 8s 的 64 位版本必
须运行在 64 位操作系统上。有关更多信息,请参阅 64 位平台上的内存使用。
修改 UNIX 内核参数
机器的 notes 文件包含用于配置操作系统资源的推荐值。可以在配置操作系统时使用这些
推荐值。
如果数据库服务器的推荐值与当前环境之间存在很大的不同,请考虑修改操作系统配置。
有关更多信息,请参阅《GBase 8s 性能指南》。
在一些操作系统上,您可以指定分配给数据库服务器的共享内存的数量。可用内存的数量
将影响那些可以为配置文件中的共享内存参数选择的值。通常,增加共享内存的可用空间
能够提高性能。您可能还需要指定锁和信号数。
有关 UNIX™ 内核参数的角色的背景信息,请参阅管理共享内存。

使用 TRUNCATE 语句来快速地从本地表删除所有行,并释放相关联的存储空
间。您可可选地为同一表及其索引保留该空间。仅 GBase 8s 支持 TRUNCATE
语句的此实现,这是对 SQL 的 ANSI/ISO 标准的扩展。
语法

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

元素
描述
限制
语法
owner
table 或 synonym 的所有者 请参阅用法说
明。
所有者名称
synonym 要从其移除所有数据的表的同
义词
必须存在,且
必须未设置
USETABLENAME
标识符
table
从其移除所有数据和它的索引
的所有 B 树结构的表名称
必须在数据库
中存在
标识符
用法
TRUNCATE 语句快速地从本地表删除所有活动的数据行和表上索引的 B 树结
构。您有释放由行和索引 extent 占据的存储空间的选项,或当随后以新的行重新
植入该表时重用相同的空间。
要执行 TRUNCATE 语句,必须满足下列条件中至少一条:

您是该表的所有者。

您在该表上持有 Delete 访问权限。

您在当前的数据库上持有 DBA 访问权限。
如果在该表上定义启用的 Delete 触发器,则您还必须在该表上持有 Alter 权限,
即使 TRUNCATE 语句不激活触发器。
对于不拥有该表的非 DBA 用户,虽然要求有 Delete 权限,但 TRUNCATE 是
数据定义语言(DDL)语句。像其他 DDL 语句一样,TRUNCATE 不可在您连
接到的数据库之外的任何表上操作,也不可在并发会话正在以 Dirty Read 隔离模
式读取的表上操作。
GBase 8s 总是记录 TRUNCATE 操作日志,即使是对于无日志记录的表。在支持
会话日志记录的数据库中,在同一事务之内的 TRUNCATE 语句之后,仅 SQL
的 COMMIT WORK 或 ROLLBACK WORK 语句是有效的。在此,ROLLBACK
语句必须取消包括 TRUNCATE 语句的整个事务。如果 ROLLBACK TO

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1108
SAVEPOINT(或除了不带有 TO SAVEPOINT 子句的 COMMIT WORK 或
ROLLBACK WORK 之外的任何其他 SQL 语句)紧跟在 TRUNCATE 语句之
后,则 GBase 8s 发出错误。
当您成功地回滚 TRUNCATE 语句时,不从该表移除任何行,且持有这些行和索
引分区的存储 extent 会被分配给该表。仅带有事务日志记录的数据库可支持
ROLLBACK WORK 语句。
在 TRUNCATE 语句成功地执行之后, GBase 8s 自动地为该表及其在系统目录
中的索引更新统计信息和分发,来展示在该表中没有行,在它的 dbspace 分区中
也没有行。不必在您提交 TRUNCATE 语句之后立即运行 UPDATE STATISTICS
语句。
如果 TRUNCATE 语句指定的表是 typed 表,则成功的 TRUNCATE 操作从那
个表和从表层级内所有的它的子表移除所有行和 B 树结构。
TRUNCATE 语句不重置 SERIAL、BIGSERIAL 或 SERIAL8 列的序列值。要重
置序列列的计数器,请使用 ALTER TABLE 语句的 MODIFY 子句,在您执行
TRUNCATE 语句之前或之后都可以。
TABLE 关键字
TABLE 关键字对此语句没有影响,但可包含它来使您的代码更加清晰易读。下列
两个语句有相同的作用,都是从 customer 表删除所有行和任何相关的索引数
据:
TRUNCATE TABLE customer;

TRUNCATE customer;
表规范
您必须指定您当前连接到的本地数据库中表的名称或同义词。如果设置
USETABLENAME 环境变量,则您必须使用表的名称,而不是同义词。该表可
为 STANDARD、RAW 或 TEMP 类型,但您不可指定视图的名称或同义词,或
CREATE EXTERNAL TABLE 语句定义了的对象。(在 对 TRUNCATE 语句的
限制 部分中罗列对 TRUNCATE 无效的表的类别。)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1109
在符合 ANSI 的数据库中,如果您不是 table 或 synonym 的所有者,则您必须
指定 owner 限定符。
在 TRUNCATE 语句开始执行之后, GBase 8s 尝试在指定的表上放置排他锁,
以防止其他会话锁定该表,直到提交或回滚 TRUNCATE 语句为止。排他锁还适
用于表层级之内的截断表的任何依赖表。
然而,在使用 Dirty Read 隔离级别的并发会话正在读表时,TRUNCATE 语句失
败并报 RSAM -106 错误。要降低此风险,您可设置 IFX_DIRTY_WAIT 环境变
量来指定 TRUNCATE 操作等待 Dirty Read 事务提交或回滚的指定的秒数。
STORAGE 规范
当 TRUNCATE 操作开始时,可选的 DROP STORAGE 或 REUSE STORAGE
关键字指定数据库服务器对表的存储 extent 采取什么行动。如果您省略此规范,
则 DROP STORAGE 选项是缺省的。
使用缺省的或显式的 DROP STORAGE 选项,成功的 TRUNCATE 语句释放当
前分配给表及其索引的 extent 之中除了第一个 extent 之外的所有 extent。您可
以 oncheck -pT table 命令显示当前的 extent 列表。如果您仅有一个 extent,
则不会释放空间。
例如,对于下表,将 4 个缺省的 8 页 extent 合并到当前的第一个 extent
内。还有第二个更大的 extent:
Extents
Logical Page Physical Page Size Physical Pages
0 1:104455 32 32
32 1:104495 4576 4576
在 TRUNCATE 语句运行之后,从同一 oncheck 命令的输出显示为:
Extents
Logical Page Physical Page Size Physical Pages
0 1:104455 32 32
或者,如果您想要为随后加载的数据保持分配给同一表的相同的存储空间,请指
定 REUSE STORAGE 关键字来防止该空间被分配。TRUNCATE 的 REUSE
STORAGE 选项可使得引用中的存储管理更有效,在这些应用中,定期地清空同
一表并以新的行重新加载。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1110
下列示例删除 state 表,并释放它的除了第一 extent 之外的所有 extent:
TRUNCATE TABLE state DROP STORAGE;
下列示例删除同一表,但仅移除实际的数据。所有 extent 保持不变。
TRUNCATE TABLE state REUSE STORAGE;
不论您指定 DROP STORAGE 还是 REUSE STORAGE,当提交 TRUNCATE 事
务时,对于表的所有行,释放任何行外数据值。还释放在 TRUNCATE 事务中不
再被引用的任何 BLOB 或 CLOB 值所占据的存储。
AM_TRUNCATE 目的函数
GBase 8s 为支持在永久表和临时表的列上的 TRUNCATE 操作的主访问方式提供
内建的 am_truncate 目的函数。它还为 B 树索引上的 TRUNCATE 操作的辅助
访问方式提供内建的 am_truncate 目的函数。
为了 TRUNCATE 语句在虚拟表接口(VTI)中正确地运行,在主访问方式中为 VTI
表的数据类型需要有效的 am_truncate 目的函数。要在数据库中注册新的主访问
方式,请使用 SQL 的 CREATE PRIMARY ACCESS_METHOD 语句:
CREATE PRIMARY ACCESS_METHOD vti(
AM_GETNEXT = vti_getnext
AM_TRUNCATE = vti_truncate
...);
您还可使用 ALTER ACCESS_METHOD 语句来将有效的 am_truncate 目的函数
添加到一没有 am_truncate 目的函数的现有的访问方式:
ALTER ACCESS_METHOD abc (ADD AM_TRUNCATE = abc_truncate);
在这些示例中,vti_truncate 和 abc_truncate 函数必须是支持 AM_TRUNCATE
目标选项关键字的功能的例程,且通过 CREATE FUNCTION 或 CREATE
ROUTINE FROM 语句预先在数据库中注册了。
TRUNCATE 的性能优势
TRUNCATE 语句不等同于 DROP TABLE。在 TRUNCATE 成功地执行之后,
指定的 table 及其所有列和索引仍注册在数据库中,但没有数据行。在一定的时
间间隔之后要求替换表中所有记录的信息管理应用中,TRUNCATE 比同等的
DROP TABLE、CREATE TABLE,以及要定义任何同义词、视图、约束、触发

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1111
器、权限、分片方案和其他属性以及表的相关联的数据库对象,需要对系统目录
的较少更新。
在不需要表的现有行的上下文中,与使用不带有 WHERE 子句的 DELETE 语句来清
空表相比,TRUNCATE 语句通常更有效率,因为 TRUNCATE 比 DELETE 需要更少的
资源和更低的日志记录开销:

DELETE FROM table 删除每一行作为分别的日志记录操作。如果在表上
存在索引,则当删除行时,必须更新每一索引,且此更新还为每一行做日
志记录。如果在表上定义一启用的 Delete 触发器,则还执行它的触发的
活动并记录日志。

TRUNCATE table 执行对表上所有行和每一索引的 B 树结构的移除,作
为单个操作,并当提交或回滚包括 TRUNCATE 的事务时,在逻辑日志
中写单个条目。忽略任何启用的触发器的被触发的活动。
当表有带有下列属性的一个或多个列时,TRUNCATE 胜于 DELETE 的这些性能
优势会降低:

存储在 blobspace 中的任何简单大对象数据类型

存储在sbspace 中的任何 BLOB、CLOB、复杂的或用户定义的类型

为其定义 destroy 支持函数的任何 opaque 类型。
这些特性的每一个都需要数据库服务器读取表的每一行,大幅降低 TRUNCATE
的速度。
如果表包括一个或多个您已为其注册了 am_truncate( ) 目的函数的 UDT,则
TRUNCATE 与 DELETE 之间的性能差异会在为 TRUNCATE 调用
am_truncate 接口一次与为每一行调用 destroy( ) 支持函数的相对成本上反映出
来。
像在下一部分中罗列的那样,某些条件导致 TRUNCATE 失败并报错。这些条件
中的某些在 DELETE 操作上没有影响,因此在那些情况下,您以 DELETE 语句
移除所有行会更有效,如在 customer 表上的下列操作所示:
DELETE customer;
仅当设置 DELIMIDENT 环境变量时,才可省略紧跟在 DELETE 之后的 FROM 关键
字,如在此示例中那样。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1112
对 TRUNCATE 语句的限制
如果存在下列任何条件,则 TRUNCATE 语句失败:

用户不持有在表上的 Delete 访问权限。

该表有启用的 Delete 触发器,但用户缺少 Alter 权限。

在本地数据库中不存在指定的表或同义词。

通过 CREATE EXTERNAL TABLE 语句定义了此表。

指定的同义词未引用本地服务器中的表。

该语句为本地表指定同义词,但设置了 USETABLENAME 环境变量。

该语句为视图指定视图或同义词的名称。

该表为系统目录表或系统监视接口(SMI)表。

在该表上定义 R 树索引。

该表是在数据库中不存在对于其有效的 am_truncate 访问方式的虚拟表
(或有虚拟索引接口)。

Enterprise Replication 复制的不是表上定义的主复制。(要获取更多关于
复制的信息,请参阅 GBase 8s Enterprise Replication 指南。)

在表上已存在共享锁或排他锁。

在表上打开一个或多个游标。

带有 Dirty Read 隔离级别的并发会话正在读表。

至少有一行的另一表在指定的表上有启用的外键约束。(然而,没有行的
另一表的启用的外键约束对 TRUNCATE 操作不起作用。)

当遇到多表关联的时候,
尤其是主表外连接多个右表,
其中关联字段为右表的hash
键的时候,
这时候为防止破坏hash 分布计算,
可根据右表数据量的大小将其创建
为复制表。
举例:
SELECT
..
..
FROM rep.statcmain
a
-- 80989472
hash 列policyno
INNER JOIN rep.statdcompanylevel d
--25887
replicate
ON
a.comcode = d.comcode
LEFT JOIN rep.statdagent
l
--86485
replicate
ON a.agentcode = l.agentcode
LEFT JOIN rep.temp_prpcengagenew
pr
--164205
hash 列policyno
ON a.policyno = prpcengagenew.policyno
LEFT JOIN rep.statdcarmodel
b
--178758 replicate
ON a.modelcode = b.modelcode
LEFT JOIN rep_dev.odsbi_prpmotorcade i
--288949 replicate
ON a.contractno = i.contractno
LEFT JOIN ..
其中,主表rep.statcmain 数据量80989472 ,hash 列policyno ,但外连接表
rep.statdcompanylevel,
rep.statdagent,
rep.statdcarmodel,
rep_dev.odsbi_prpmotorcade
的关联字段为非hash 键,将这些表创建为复制表,可以防止拉表做到一步下发。