返回首页

gbase数据、南大通用产品文档:GBase8s存储优化

更新日期:2024年09月11日

数据压缩和合并方法可将数据所用磁盘空间降到最低。
下表描述可用于减小数据所用磁盘空间量的方法。
表 1. 存储优化方法
存储优化方法
用途
何时使用
压缩数据
压缩表或分段行中的数据,从而减小
所需磁盘空间量
压缩数据之后,还可以合并表或分段
中剩余的可用空间,并将这些可用空
间返还给数据库空间。
希望减少表中的数据大小时
重新打包数据 合并表和分段中的可用空间
压缩数据之后,或希望单独合
并表或分段中的可用空间时
收缩数据
将可用空间返还给数据库空间
压缩或重新打包数据之后,或
希望单独将可用空间返还给数
据库空间时
为表扩展数据
块取消分段
使邻接的合并扩展数据块中的数据行
靠得更紧密
经常更新的表在多个非邻接扩
展数据块之间变得分散时
可自动执行以上任意一个或所有方法。
可在 OpenAdmin Tool (OAT) 中执行这些方法,
也可以使用 SQL 管理 API 函数进行编程
来执行这些方法。

自动优化数据存储
可通过更新 auto_crsd 调度程序任务,为表和扩展数据块配置自动压缩、收缩、重新打包
和取消分段。
必须以用户 gbasedbt 或其他授权用户身份连接 sysadmin 数据库。
要启用和配置自动存储优化,请执行以下操作:
1. 通过在 ph_task 表上使用 UPDATE 语句将 tk_enable 列的值设置为 T,从而启
用 auto_crsd 调度程序任务。例如,以下语句启用 auto_crsd 任务:
UPDATE ph_task
SET tk_enable = 'T'
WHERE tk_name = 'auto_crsd';
2. 可选:通过在 ph_threshold 表上使用 UPDATE 语句来将阈值的 value 列设置为
F,从而禁用单个操作:
o AUTOCOMPRESS_ENABLED:控制压缩
o AUTOREPACK_ENABLED:控制重新打包

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 243 -
o AUTOSHRINK_ENABLED:控制收缩
o AUTODEFRAG_ENABLED:控制取消分段
例如,以下语句只禁用 auto_crsd 任务的取消分段存储操作:
UPDATE ph_threshold
SET value = 'F'
WHERE name = 'AUTODEFRAG_ENABLED';
3. 可选:通过在 ph_threshold 表上使用 UPDATE 语句来更改阈值的 value 列的
值,从而更改单个操作的阈值:
o
AUTOCOMPRESS_ROWS:压缩的阈值是未压缩行数。缺省阈值为 10 000
行。在未压缩行数超过 10 000 时,将压缩表。
o
AUTOREPACK_SPACE:重新打包的阈值为非邻接空间的百分比。缺省值
为 90%。在表占用的空间中 90% 以上的空间非连续时,将重新打包该表。
o
AUTOSHRINK_UNUSED:表或分段的收缩阈值是已分配的未用空间的百
分比。缺省值为 50%。在 50% 以上的已分配空间未被使用时,将收缩表或
分段。
o
AUTODEFRAG_EXTENTS:
表或分段扩展数据块的取消分段阈值是扩展数
据块的数量。缺省值为 100。在扩展数据块的数量超过 100 时,将对表或分
段执行取消分段操作。
例如,以下语句将压缩阈值更改为 5000 行:
UPDATE ph_threshold
SET value = '5000'
WHERE name = 'AUTOCOMPRESS_ROWS';
或者,除了运行已调度的自动压缩任务之外,还可以通过 SQL 管理 API create dictionary
命令或初始 compress 命令来启用自动压缩。对表或表分段运行 SQL 管理 API create
dictionary 命令或初始 compress 命令时,将启用后续数据装入(包含 2000 行或更多行数
据)的自动压缩。
您还可以使用 CREATE TABLE 语句的 COMPRESSED 选项来支持在将数据装入表或表
分段时对大量行内数据执行自动压缩。CREATE TABLE 语句的 COMPRESSED 选项不支
持对数据库空间或索引中的简单大对象执行自动压缩。

对分区取消分段
可以通过对分区取消分段以将非邻接的扩展数据块合并,从而提高性能。
随着时间推移,经常更新的表可能变为分段表,从而当服务器每次访问表时,导致性能下
降。对表取消分段可使数据行更紧密的集合在一起,并避免分区标题页溢出问题。对索引
取消分段会让条目更集中,这会提高存取表信息的速度。
要确定表、索引或分区有多少扩展数据块,可运行 oncheck -pt and pT 命令。
要为表、
索引或分区取消分段,
请运行带 defragment 自变量或 defragment partnum 自变量
的 SQL 管理 API task() 或 admin() 函数,并指定要取消分段的表名、索引或分区号。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 244 -
限制和注意事项
对分区取消分段之前,请查看以下重要注意事项:

提交取消分段请求之后,无法停止该请求。

不能为以下对象取消分段:
o 伪表,如虚拟表接口 (VTI) 表
o 包含虚拟索引接口 (VII) 索引的表
o 包含 B 型树函数索引的表
o 临时表
o 排序文件
o 光盘 BLOB 文件

不得对要取消分段的表或分区发出冲突操作。必须先完成第一个操作,再启动第二
个操作。如果第一个操作仍在运行,对第二个操作的请求将返回错误。以下列表中
包含冲突操作示例:
o 一个分区一次只能运行一个取消分段请求。
o 一个数据库空间一次只能运行一个取消分段请求。
o 如果表或分区上正在运行 DROP TABLE 或 ALTER FRAGMENT 之类的
DDL 语句,那么不能为表取消分段。
o 不能为正在截断的表取消分段。
o 不能为正在压缩或解压缩的表取消分段。
o 不能为正在运行联机索引构建的表取消分段。
o 不能为设置了互斥存取的表取消分段。
如果完成取消分段请求时发生问题,将向联机日志文件发送错误消息。

数据压缩
可以压缩和解压缩表与分段中的行数据和/或数据库空间中的简单大对象。可以压缩表与表
分段中的数据,以减少占用的磁盘空间量。还可以合并表或分段中的可用空间,然后将这
些可用空间返还给数据库空间。 压缩数据之前,可估计可以节省的磁盘空间量。
压缩数据、整合数据以及返还可用空间具有以下益处:
 显著节省磁盘存储空间
 减少压缩的分段的磁盘使用量
 显著节省逻辑日志使用量,这样在完成压缩操作后可节省额外空间并可以防止高吞
吐量 OLTP 的瓶颈。
 页面读取更少,因为更多行可以置于一个页面中
 缓冲池更小,因为更多数据置于同一大小的池中
 I/O 活动减少,因为:
o 与未压缩行相比,更多压缩行置于一个页面中
o 压缩行的插入、更新和删除操作的日志记录更小
 可以压缩按时间分段数据的不常访问的较旧分段,
而让频繁访问的更多近期数据处
于未压缩的格式
 可以释放表不再需要的空间
 备份与复原更快

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 245 -
I/O 绑定表
(例如,
高速缓存命中率低的表)
非常适合压缩。
在 OLTP 环境中,
压缩 I/O 绑
定表可以提高性能。
但是,如果应用程序运行时具有很高的缓冲区高速缓存命中率,并且高性能比空间使用量
更重要,那么可能不希望压缩数据,因为压缩可能会稍微降低性能。
查询可以访问压缩表中的数据。
由于与未压缩数据相比,压缩的数据占用更少页面且每页中有更多行,所以查询优化器可
能在压缩后选择不同的计划。
如果使用 Enterprise Replication (ER),
那么压缩一个复制服务器上的数据不会影响其他任何
复制服务器上的数据。
如果使用高可用性数据复制 (HDR),源表中的压缩数据在目标表中也处于压缩状态。不能
在 HDR 辅助服务器、RS 辅助服务器或 SD 辅助服务器上执行压缩操作,因为 HDR 目
标服务器必须具有与源服务器相同的数据和物理布局。
不能使用 onload 和 onunload 实用程序将压缩后的数据从一个数据库移至另一个数据库。
在使用 onload 和 onunload 实用程序之前,您必须将压缩表和分段中的数据解压缩。
可使用 OpenAdmin Tool (OAT) 执行与压缩相关的操作,也可通过运行包含带有压缩参数
的 SQL 管理 API 命令的 SQL 语句来执行这些操作。 对表或表分段运行 SQL 管理
API create dictionary 命令或初始 compress 命令时,将启用后续数据装入(包含 2000 行
或更多行数据)的自动压缩。
在 GBase 8s 中,必须运行启用压缩的 SQL 管理 API 命令才可以对表或分段进行压缩。
如果启用了压缩,那么必须遵循以下 GBase 8s 还原过程,以更改回没有数据压缩功能的
服务器版本,并且必须解压缩或删除任何压缩表和分段。
取代压缩的主要方法是购买更多物理存储器。取代减少 IO 绑定工作负载内的瓶颈的主要
方法是购买更多物理内存,以便扩展缓冲池。
可压缩的数据
可以压缩行中的数据以及数据库空间中的简单大对象。但是,您可能并不希望压缩可压缩
的所有类型的数据。
具有经常重复的长模式的表或表分段数据非常适合压缩。特定类型的数据(如文本)可能
比其他类型的数据(如数字数据)更适合压缩,因为文本之类的数据类型可能包含更长、
更频繁重复的模式。
但是,不能仅根据数据类型来预测压缩率。例如:
 不同语言或字符集的文本的压缩率可能不同,即使文本存储在 CHAR 或
VARCHAR 列中也是如此。
 大部分由零构成的数字数据压缩率可能很高,而可变数字数据较多则压缩率可能不
高。
 具有大量空格的数据压缩率较高

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 246 -
 已使用其他某种算法压缩的数据和已加密的数据的压缩率可能不高。例如,行中的
图像和声音采样可能已经压缩,
因此再次压缩这些数据不会再额外节省任何空间。

GBase 8s 可压缩任意数据类型的组合,因为它将所有数据视为未结构化的字节序列来压
缩。因此,服务器可以压缩跨多个列的模式,如城市、州和邮政编码的组合。(服务器对
字节序列的解压缩顺序与数据压缩之前存在的顺序相同。)
可以压缩:
 数据行的内容,包括跨多页的行的任何剩余片段,以及包含在逻辑日志记录中的行
的映像。
 数据库空间中的简单大对象
(例如,
XML 文件、
PDF 文件或其他包含文本的文档)

压缩仅应用于数据行的内容,包括跨多页的行的剩余片段,以及包含在逻辑日志记录中的
行的映像。
不能压缩的数据
不能压缩某些类型的表和分段中的行数据。不能压缩索引中的数据,也不能压缩某些类型
的表和分段中的数据。
不能压缩以下对象的行中的数据:
 sysmaster、sysutils、sysuser、syscdr 和 syscdcv1 数据库中的表或分段
 目录
 临时表
 虚拟表接口表
 表空间 tblspace(这些是隐藏分段,每个数据库空间一个隐藏分段。每个表包含有
关数据库空间内所有分段的元数据。)
 内部分区表
 字典表,每个数据库空间一个字典表(这些表包含该数据库空间内已压缩的分段或
表的压缩字典,以及有关这些字典的元数据。)
 索引
 在其中正在执行联机索引构建的表
也不能压缩 BLOB 空间中的简单大对象。
不会将压缩应用于索引数据、存储在行外的 LOB 数据,或其他任何形式的非行数据。
加密的数据、已经通过其他算法压缩的数据,以及没有长重复模式的数据压缩效果不佳或
不压缩。 请尽量不要将包含压缩效果不佳的数据的列放在具有常用模式的列之间,以防止
跨列模式的可能损坏。
如果存储 XML 数据时将第一部分放在行中,将其余部分放在该行外,那么压缩将仅应用
于存储在行中的数据。
仅当压缩行的映像小于未压缩映像时,GBase 8s 才会压缩行的映像。即便压缩后的行仅比
其未压缩映像稍小,但节省的少量空间也可以让服务器在页中放入更多行。
压缩估算

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 247 -
压缩表或表分段之前,可估算压缩数据后将可节约的空间量。显示的比率根据行数据的样
本估算。实际节约的空间比率可能稍有不同。
GBase 8s 通过以下方法估算压缩率:对行数据随机采样(使用与字典构建相同的采样算
法),然后计算以下项的大小总和:
 未压缩行映像
 使用新压缩字典(由估算压缩命令临时创建的压缩字典)得到的压缩行映像
 使用存在的现有字典得到的压缩行映像(如果没有现有字典,该值将与未压缩行映
像的大小之和相同。)
获得的空间实际节约比率可能由于以下原因而有所差异:
 发生了较小的采样错误。
 估算是基于行的原始压缩能力。
例如,服务器通常尝试将整个行放入一页中。因此,如果每个未压缩行几乎填满
一整页,并且压缩率低于 50%,那么每个压缩行仍将填满大半页,而即使在压缩
之后,服务器仍倾向于将每行放在单独的一页上。在这种情况下,尽管估算的压
缩率可能为 45%,实际节约的空间则可能为 0%。
每个未压缩行填充页的一半稍多。每个未压缩行将占用一整页,因为两个整行的
总大小已超出一页。 例如,估算的压缩率可能为 5%,但是该压缩率可能刚够将
每个行收缩到小于半页。所以,压缩之后,两行可放入一页,实际节约的空间可
能为 50%。
实际获得的压缩可能与估算不一样,因为 GBase 8s 在一页中存储的行数不能超过 255。
所以小行或大页会减少压缩可获得的节约总量。 例如,如果压缩前一页中有 200 行,无
论压缩后行有多小,最大有效压缩率均接近 20%,因为压缩后一页中只能有 255 行。
如果使用的页面大于最小页大小,那么可通过切换到更小的页来增加实现的压缩空间节约
量,从而:
 不再达到 255 行的限制。
 如果仍然达到了该限制,页中的未使用空间将更少。
如果压缩操作包含重新打包操作、收缩操作或重新打包并收缩操作,那么可节约更多(或
更少)空间。仅当一页中的压缩行数超过了未压缩行数,重新打包操作才能节约更多空间。
如果重新打包操作释放出空间,那么收缩操作可以在数据库空间级别节约空间。
压缩数据和存储优化的图示
本主题中的图示显示使用分段中大部分空间的未压缩数据、压缩数据时创建的可用空间、
执行重新打包操作之后移动到分段末尾的可用空间,以及执行收缩操作之后留在分段中的
数据。
图: 压缩和存储优化处理期间分段中的数据


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


压缩和解压缩数据
此方案显示如何运行 SQL 管理 API 命令来管理压缩和存储优化。
在该方案中,用户 mario 所有的数据库 music 内有一个表 rock。
先决条件:
 表的每个分段中必须至少有 2000 行,而不仅是整个表总共只有 2000 行。
 您必须可以连接到 sysadmin 数据库(缺省情况下只有用户 gbasedbt 可连接),
并且必须是 DBSA。
 如果希望运行的任何工作负载(包括但不限于压缩操作)耗用日志文件的速度超过
每 30 秒一个文件,那么必须将日志配置为比当前大小更大。
 如果希望运行的任何工作负载(包括但不限于这些压缩操作)耗用日志文件的速度
超过每 30 秒一个文件,请将日志配置为比当前大小更大。compress、repack、
repack_offline、uncompress 和 uncompress_offline 操作可能会耗用大量日志。
 如果在使用 GBase 8s,必须先启用压缩,才能压缩数据。要启用压缩,请运行以下
命令:
EXECUTE FUNCTION task("enable compression");
无需启用压缩,即可使用 estimate_compression 自变量估算压缩数据可节约的
空间量。如果要使用 shrink、repack 或 repack_offline自变量在不压缩任何行
数据的情况下从表中释放空间,也无需启用压缩。
要同时压缩行数据以及数据库空间中的简单大对象:

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 249 -
要压缩和解压缩行数据,请执行以下操作:
1. 不确定是否要压缩 rock 表,那么可以运行以下命令来检查压缩该表可节约的空间
量:
EXECUTE FUNCTION task("table estimate_compression", "rock", "music",
mario");
复审生成的报告,
其中指示可为 rock 表当前使用的空间节约 75%。
您决定压缩表。

2. 压缩数据之前,希望创建压缩字典,其中包含 GBase 8s 用于压缩 rock 表中的数
据的信息。运行以下命令
EXECUTE FUNCTION task("table create_dictionary", "rock", "music", "mario");
如果不作为单独的步骤来创建压缩字典,GBase 8s 将在您压缩数据时自动创建字
典。
3. 您决定要压缩 rock 表中的数据以及数据库空间中的简单大对象,合并这些数据,
然后将可用空间返还给数据库空间。 可以运行以下命令:
EXECUTE FUNCTION task("table compress repack shrink", "rock", "music",
"mario");
如果决定仅压缩行数据或仅压缩数据库空间中的简单大对象,请通过将 rows 或
blobs 插入到单词 compress 之后或字符串 compress repack shrink 之后
来调整命令。例如:
o 要仅压缩行数据,请指定:
EXECUTE FUNCTION task("table compress rows","rock","music","mario");
o 要仅压缩行数据,然后重新打包和收缩数据,请指定:
EXECUTE FUNCTION task("table compress repack shrink rows",
"rock","music","mario";
o 要仅压缩数据库空间中的简单大对象,请指定:
EXECUTE FUNCTION task("table compress blobs","rock","music","mario");
压缩现有行和简单大对象之后,GBase 8s 会合并表末尾留下的可用空间,然后从
表中除去这些可用空间,从而将该空间返还给数据库空间。
如果简单大对象或行 /* 在压缩后并不会变小,那么数据库服务器不会对其进行压
缩。
4. 现在假设必须解压缩数据。可以运行以下命令:
EXECUTE FUNCTION task("table uncompress", "rock", "music", "mario");
5. 您希望除去压缩字典。
.
验证 Enterprise Replication 是否不需要该字典。
如果 Enterprise Replication 确实需要这些已解压缩或已删除的表和分
段的压缩字典,请勿除去这些字典。
a. 归档其中包含带有压缩字典的表或分段的数据库空间。
b. 运行以下命令:
EXECUTE FUNCTION task("table purge_dictionary", "rock", "music", "mario");

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 250 -
按照压缩和解压缩行中数据以及数据库空间中简单大对象的相同方式来压缩和解压缩表分
段中的数据以及数据库空间中的简单大对象,但是不同之处在于,运行的命令具有以下格
式:
EXECUTE FUNCTION task("fragment compression_arguments", "partnum_list");
如果要在不执行压缩或重新压缩的情况下合并可用空间或返还可用空间,
可运行一个命令,
指示服务器重新打包、收缩或重新打包并收缩。
启用压缩
在 GBase 8s 中,必须先运行用于启用压缩的 SQL 管理 API admin() 或 task()命令,才能
对实例中的表或表分段执行首次压缩或解压缩操作。
在 GBase 8s 中,压缩将自动启用。
您必须可以连接到 sysadmin 数据库(缺省情况下只有用户 gbasedbt 可连接),并且必
须是 DBSA。
但是,在启用压缩之前,可以估算压缩率、合并可用空间(重新打包)和将可用空间返还
给表或分段(收缩)。
要启用压缩,请执行以下操作:
运行带 enable compression 自变量的 admin() 或 task() 函数。
例如,指定:
EXECUTE FUNCTION task(“enable compression”);
启用压缩之后,可创建压缩字典,或者也可以压缩表的行或者分段表的特定分段或所有分
段的行。
估算压缩率
如果压缩表或者分段表的特定分段或所有分段,可估算可节约的空间百分比。该命令将显
示可用于确定是否要压缩或重新压缩行数据的信息。
先决条件:
您必须可以连接到 sysadmin 数据库
(缺省情况下只有用户 gbasedbt 可连接)

并且必须是 DBSA。
用于估算压缩率的命令总是同时估算新压缩率和当前压缩率。
有关压缩率和估算的一般信息,请参阅压缩率和压缩估算。
要估算压缩的优点,请执行以下操作:
运行带 estimate_compression 自变量的 admin() 或 task() 函数。
例如,为表使用以下语法:
EXECUTE FUNCTION task(“table estimate_compression", “table_name”,
“database_name”, “owner_name”);
对于分段,请使用以下语法:

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 251 -
EXECUTE FUNCTION task(“fragment estimate_compression”“partnum_list”);
以下示例显示了这样的一个命令:指示 GBase 8s 估算所有者为“wong”的“store123”数
据库内名为“cash_transaction”的表的压缩优点。
EXECUTE FUNCTION task("table estimate_compression", "cash_transaction",
"store123", "wong");
估算压缩操作显示可实现的估算压缩率、当前压缩率、对获得或失去的百分比的估算、每
个分段的分区号,以及表的全名,包括数据库、所有者和表名。如果表未压缩,那么当前
比率为 0.0%。
在以下示例中,已经压缩了第一个分段。未压缩第二个分段。如果重新压缩第一个分段,
可以节约的空间会增加 0.4%。如果压缩第二个分段,可以增加 75.7%。
est curr change partnum coloff table
-------- ------------ ----------- --------------- -------- -------------------------------------
75.7% 75.3% +0.4 0x00200003 -1 store3:wg.cash_transaction
75.7% 0.0% +75.7 0x00300002 -1 store3:wg.cash_transaction

est curr change partnum table
--------- -------- -------- ------------------ ----------------------------------------------
75.7% 75.3% +0.4 0x00200003 store123:wong.cash_transaction
75.7% 0.0% +75.7 0x00300002 store123:wong.cash_transaction
表和分段的压缩估算输出看起来几乎相同,
不同之处在于表的输出始终显示表中的所有分
段,而分段的输出仅显示指定分段的信息。
创建压缩字典
可根据现有行创建压缩字典,以供 GBase 8s 压缩表或表分段中的数据时使用。创建字典
之后,GBase 8s 将使用该字典来压缩新插入或更新的行。
如果没有压缩字典,您也可以在运行压缩命令时创建。这两个命令的唯一差别是压缩命令
还将压缩表或分段中的现有数据。
如果数据已装入表中,并且您要创建字典以用于在装入数据时压缩新数据,那么可以为该
表创建压缩字典。
该表或分段必须至少包含 2000 行数据,然后数据库服务器才能创建压缩字典。如果创建
字典时,表或分段没有足够的数据用于字典,那么该表或分段将设置为自动压缩。然后,
在该表或分段中装入了足够的数据后,数据库服务器将自动创建该字典。
有关压缩字典的一般信息,请参阅压缩字典。
先决条件:
 您必须可以连接到 sysadmin 数据库(缺省情况下只有用户 gbasedbt 可连接),
并且必须是 DBSA。
 如果要为分段创建压缩字典,
分段中必须至少包含 2,000 行。
如果要为表创建压缩
字典,该表的每个分段必须至少包含 2,000 行。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 252 -
要创建压缩字典,请执行以下操作:
运行带 table create_dictionary 或 fragment create_dictionary 自变量的 admin() 或 task()
函数。
例如:
 为表指定信息,如下所示:
EXECUTE FUNCTION task(“table create_dictionary”, “table_name”,
“database_name”, “owner_name”);
必须指定表名。
数据库和所有者名称可选。
如果不指定数据库或所有者名称,
GBase
8s 将使用当前数据库和所有者名称。
 为分段指定信息,如下所示:
EXECUTE FUNCTION task(“fragment create_dictionary”, partnum_list”);
partnum_list 列出了分区号,以空格分隔。
以下示例显示了这样的一个命令:指示 GBase 8s 为所有者为“shakar”的“music”数据
库内名为“classical”的表创建压缩字典。
EXECUTE FUNCTION task("table create_dictionary","classical","music","shakar");
要在创建压缩字典之后压缩现有表或分段行中的数据,必须运行压缩命令。
只有在解压缩表或分段之后,才能删除压缩字典。
合并表中的可用空间
压缩表或分段时,可以合并(重新打包)表和分段中的可用空间,或单独合并可用空间,
而不进行压缩。
可以使用 repack 或 repack_offline 自变量,以联机或脱机方式执行重新打包操作。
repack_offline 操作与 repack 操作相同,但当 GBase 8s 在表或分段上持有互斥锁定期间
执行操作时例外。 此操作在完成之前,会阻止对数据的所有其他访问。
如果执行 repack 操作时在表或分段中进行了轻量级追加,那么 repack 操作不会在表或分
段的末尾完成空间合并。repack 操作无法完成的原因是,在已执行了 repack 操作的位置
中添加了新的扩展数据块,因此空间无法返还给数据库空间。要完成 repack 进程,必须在
完成轻量级追加活动之后,再运行一次 repack 操作。第二次运行的 repack 操作将在第一
次 repack 操作工作的基础上构建。
完成 repack_offline 操作之前删除或禁用索引可以缩短服务器完成此操作所用时间量。之
后,可以重新创建或重新启用索引,最好是利用 PDQ。先删除或禁用索引,再重新创建或
启用索引,要比不这样做而直接完成 repack_offline 操作的速度更快。
先决条件:
 您必须可以连接到 sysadmin 数据库(缺省情况下只有用户 gbasedbt 可连接),
并且必须是 DBSA。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 253 -
 如果希望运行的任何工作负载(包括但不限于 repack 或 repack_offline 操作)耗
用日志文件的速度超过每 30 秒一个文件,请将日志配置为比当前大小更大。
要合并表中的可用空间,请执行以下操作:
1. 运行使用 table repack、table repack_offline、fragment repack 或 fragment
repack_offline 命令自变量的 admin() 或 task() 函数。
例如,为表指定:
EXECUTE FUNCTION task(“table repack”, “table_name”,“database_name”,
“owner_name”);
必须指定表名。数据库和所有者名称可选。 如果不指定数据库或所有者名称,
GBase 8s 将使用当前数据库和所有者名称。
例如,为分段指定:
EXECUTE FUNCTION task(“fragment repack_offline”, “partnum_list”);
partnum_list 是属于同一个表的分区号的空格分隔列表。
2. (可选)扩展自变量以在以下任意组合中包含 compress 和 shrink:
o
compress repack
o
compress repack shrink
o
repack shrink
以下示例显示了这样的一个命令:指示 GBase 8s 合并所有者为“bob”的一个“music”
数据库中名称为“opera”的表中的可用空间。
EXECUTE FUNCTION task("table repack","opera","music","bob");
以下示例显示了这样的一个命令:指示 GBase 8s 以脱机方式合并所有者为“bob”的一
个“music”数据库中名称为“folk”的表中的可用空间。
EXECUTE FUNCTION task("table repack_offline","folk","music","janna");
以下示例显示这样的一个命令:指示 GBase 8s 合并可用空间,并将空间返还给数据库空
间中分区号为 14680071 的分段。
EXECUTE FUNCTION task("fragment repack shrink", "14680071");
可以取消使用 compress 自变量的命令,例如在 DB-Access 中输入 CTRL-C。之前中断命
令之后,可重新发出带 repack 或 repack_offline 自变量的命令。(压缩和重新打包操作将
记录,但是在较小的部分中运行。)
将可用空间返还给数据库空间
压缩、重新打包或压缩并重新打包表或分段时,可将可用空间返还给数据库空间(收缩空
间);也可在不压缩或重新打包的情况下单独返还可用空间。 返还可用空间将减小分段或
表的总大小。
可在不影响表的分配策略的情况下,安全收缩整个表。例如,如果有一个分段表,一周的
每一天都有一个分段,并且还有许多预分配的分段供将来使用,那么可在不影响该分配策

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 254 -
略的情况下收缩该表。如果该表为空,GBase 8s 将把该表收缩为创建该表时指定的初始扩
展数据块大小。
启动收缩操作时,GBase 8s 将缩小扩展数据块,如下所示:
 将除第一个扩展数据块之外的其他所有扩展数据块尽量缩小。
 如果整个表都在第一个扩展数据块中(例如,因为该表是空表),GBase 8s 将不把
第一个扩展数据块收缩为小于使用 CREATE TABLE 语句创建该表时指定的扩
展数据块大小。
可以使用 ALTER TABLE 语句的 MODIFY EXTENT SIZE 子句来减小当前扩展数据块大
小。执行此操作之后,可重新运行收缩操作,以便将第一个扩展数据块收缩为新扩展数据
块大小。
先决条件:
您必须可以连接到 sysadmin 数据库
(缺省情况下只有用户 gbasedbt 可连接)

并且必须是 DBSA。
要将可用空间返还给数据库空间:
1. 运行带 table shrink 或 fragment shrink 自变量的 admin() 或 task() 函数。
例如,为表指定:
EXECUTE FUNCTION admin(“table shrink”, “table_name”, “database_name”,
“owner_name”);
必须指定表名。
数据库和所有者名称可选。
如果不指定数据库或所有者名称,
GBase
8s 将使用当前数据库和所有者名称。
例如,为分段指定:
EXECUTE FUNCTION task(“fragment shrink”, “partnum_list”);
partnum_list 是属于同一个表的分区号的空格分隔列表。
2. 可以选择扩展自变量以在以下任意组合中包含 compress 和 repack:
o
compress repack shrink
o
compress shrink
o
repack shrink
以下示例显示了这样的一个命令:指示 GBase 8s 收缩所有者为“bob”的“music”数据库
内名为“opera”的表。
EXECUTE FUNCTION task("table shrink","opera","music","bob");
以下示例显示了这样的一个命令:指示 GBase 8s 重新打包和收缩分区号为 14680071 的
分段。
EXECUTE FUNCTION task("fragment repack shrink," "14680071");
解压缩数据
可解压缩之前压缩的表和分段。解压缩表或分段将停用对新的插入和更新操作的压缩、解
压缩所有已压缩的行、停用压缩字典,并对不再适合其原始页面的行分配新页面。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 255 -
可使用 uncompress 或 uncompress_offline 自变量,以联机或脱机方式解压缩。 脱机解压
缩操作与解压缩的操作相同,不同之处是该操作在执行时对分段保持互斥锁定,以便在完
成操作之前,避免其他对分段数据进行的所有访问。
完成脱机解压缩操作之前删除或禁用索引可以减少服务器完成此操作需要的时间量。
之后,
可以重新创建或重新启用索引,
最好是利用 PDQ。
先删除或禁用索引,
再重新创建或启用,
这种做法比不这样做而直接完成脱机重新打包或脱机解压缩操作的速度更快。
先决条件:
 您必须可以连接到 sysadmin 数据库(缺省情况下只有用户 gbasedbt 可连接),
并且必须是 DBSA。
 必须压缩表或分段。
 如果希望运行的任何工作负载(包括但不限于 uncompress 或 uncompress_offline
操作)耗用日志文件的速度超过每 30 秒一个文件,请将日志配置为比当前大小
更大。
要解压缩表或分段中的数据,请执行以下操作:
运行带 table uncompress、table uncompress_offline、fragment uncompress 或 fragment
uncompress_offline 命令自变量的 admin() 或 task() 函数。
为表指定信息,如下所示:
EXECUTE FUNCTION task(“table uncompress”, “table_name”,“database_name”,
“owner_name”);

EXECUTE FUNCTION admin(“table uncompress_offline”, “table_name”,
“database_name”, “owner_name”);
必须指定表名。数据库和所有者名称可选。如果不指定数据库或所有者名称,GBase 8s 将
使用当前数据库和所有者名称。
为分段指定信息,如下所示:
EXECUTE FUNCTION task(“fragment uncompress”, “partnum_list”);

EXECUTE FUNCTION task(“fragment uncompress_offline”, “partnum_list”);
示例
以下示例显示了这样的一个命令:指示 GBase 8s 解压缩所有者为“mario”的“music”数
据库内名为“rock”的表。
EXECUTE FUNCTION task("table uncompress","rock","music","mario");
以下示例显示了这样的一个命令:指示 GBase 8s 以脱机方式解压缩分区号为 14680071
的分段。
EXECUTE FUNCTION task("fragment uncompress_offline," "14680071");

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 256 -
如果已解压缩表,GBase 8s 将把该表的字典标记为不活动。GBase 8s 不会删除字典,因为
Enterprise Replication 函数会将字典用于较旧的日志。可删除不再需要的字典。
您可以取消带 uncompress 自变量的命令,如在 DB-Access 中按 CTRL-C。
之前中断命令之后,
可重新发出带 uncompress 和 uncompress_offline 自变量的命令。
(压
缩、重新打包和解压缩操作将记录,但是在较小的部分中运行。)
删除压缩字典
可删除特定表或分段的不活动压缩字典,删除所有不活动压缩字典,或删除达到指定日期
的所有不活动压缩字典。删除为表和分段创建的任何压缩字典之前,必须解压缩表和分段,
以使字典处于不活动状态。
请勿除去 Enterprise Replication 需要的压缩字典。
不能删除为索引创建的压缩字典。删除索引时,数据库服务器会除去这些压缩字典。
先决条件:
 您必须可以连接到 sysadmin 数据库(缺省情况下只有用户 gbasedbt 可连接),
并且必须是 DBSA。
 删除关联字典之前,请解压缩或删除表或分段。只能删除压缩表或分段不再使用的
压缩字典。
 确保 Enterprise Replication 函数未将压缩字典用于较旧的日志。
 归档包含具有压缩字典的表或分段的任何数据库空间,即使表或分段中的数据已解
压缩并且字典不再处于活动状态。
要删除不再需要的一个或多个压缩字典,请执行以下操作:
运行带以下自变量的 admin() 或 task() 函数:
 table purge_dictionary 或 fragment purge_dictionary 命令自变量,
用于删除特定的不
活动字典。
 compression purge_dictionary 命令自变量,用于删除所有字典。
 compression purge_dictionary 命令自变量和日期,用于删除该日期及之前创建的所
有字典。
任何可根据您的语言环境转换为 DATE 数据类型格式的日期均可使用。 例如,
可以指定 01/31/2012、01/31/12 或 Jan 31, 2012。
示例 1:运行以下命令可除去所有者为“arlette”的“music”数据库中表“latin”的不活动
字典。
EXECUTE FUNCTION task(“table purge_dictionary”, “latin”, “music”,”arlette”);
示例 2:运行以下命令可除去 2011 年 3 月 8 日及之前创建的所有字典:
EXECUTE FUNCTION task(“compression purge_dictionary”, "03/08/11");
压缩表时,数据库服务器会创建一个内部分区用于保存压缩字典。解压缩表和清除字典时,
数据库服务器会除去该字典。 但是,内部分区不会除去。如果为保存字典而创建的内部分

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 257 -
区位于第二个块上,那么可能会有一个块只包含内部分区。 如果发生此情况,将无法删除
该块。可以备份数据库空间,然后将其删除。
移动压缩数据
可使用 High-Performance Loader (HPL) 或其他任何 GBase 8s 实用程序(onunload 和
onload 实用程序除外)来移动压缩数据。
不能使用 onunload 和 onload 实用程序将压缩后的数据从一个数据库移动到另一个。
在使
用 onunload 和 onload 实用程序之前,您必须将压缩表和分段中的数据解压缩。
dbexport 实用程序用于解压缩压缩的数据。因此,如果数据库包含带有压缩数据的表或分
段,那么必须在使用 dbimport 实用程序导入数据之后重新启用压缩和重新压缩。
dbexport 实用程序用于解压缩压缩的数据。因此,如果数据库包含带有压缩数据的表或分
段,那么必须在使用 dbimport 实用程序导入数据之后重新压缩。
有关使用 HPL 或 GBase 8s 实用程序的详细信息,请参阅《GBase 8s High-Performance
Loader 用户指南》或《GBase 8s 迁移指南》。

B 型树索引压缩和存储优化
可以压缩拆离的 B 型树索引。
您还可以合并索引中的可用空间,
然后可将索引末尾的可用
空间返还给数据库空间。压缩数据之前,可估计可以节省的磁盘空间量。
压缩索引、合并数据并返还可用空间会带来以下益处:
 可将更多数据放入缓冲区高速缓存
 释放内存用于其他用途
使用 CREATE INDEX 命令创建新索引时,可以对其进行压缩。
可以压缩位于分段或非分段表上的现有拆离 B 型树索引。使用 SQL 管理 API 命令来压
缩现有索引。
您不能压缩以下类型的索引:
 不是 B 型树索引的索引
 连接的 B 型树索引
 虚拟 B 型树索引
 键数少于 2000(这是可压缩索引需要的最小键数)的索引
先决条件:要能够进行压缩,索引必须至少有 2000 个键。
压缩操作仅压缩索引的叶子(底层)。
不能将已压缩的索引解压缩。如果不再需要已压缩的索引,可以删除该索引,然后将其重
新创建为未压缩的索引。

压缩率

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 258 -
压缩率取决于压缩的数据。GBase 8s 使用的压缩算法是基于字典的算法,该算法对找到的
最常用的数据模式执行操作,方法是在构建该字典时采样的数据中按长度加权。
如果典型数据分发与创建字典时采样的数据存在偏差,压缩率可能降低。
最大压缩率可能为 90%。这是因为任何顺序的字节的最大可能压缩率是通过以下方法得出
的:将每组 15 个字节替换为一个 12 位的符号数,从而生成占原始映像大小 10% 的压
缩映像。但是,并不容易获得 90% 的压缩率,因为 GBase 8s 会向每个压缩映像添加一个
字节的元数据。

压缩字典
对于每个压缩分段和每个压缩的非分段表,都存在一个单独的压缩字典。对于每个压缩分
段、每个压缩的非分段表、数据库空间中的每个压缩简单大对象和每个压缩索引分区,都
存在一个单独的压缩字典。每个压缩字典是由分段或表数据中经常出现的模式和替换这些
模式的符号数构成的库。
压缩字典是使用从至少包含 2,000 行的分段或非分段表随机采样的数据构建的。如果分段
或表中包含的行数不足 2,000,那么 GBase 8s 不会构建压缩字典。
压缩字典最多可存储 3,840 个模式,
每个模式的长度可以为 2 到 15 个字节。
(超过 7 个
字节的模式将减少字典可包含的模式的总数。)这些模式中的每一个都通过压缩行中的 12
位符号数来表示。要进行压缩,输入行映像中的一系列字节必须精确匹配字典中的某个完
整模式。如果行与字典匹配的模式不足,那么可能无法压缩,因为不完全匹配的输入行中
的每个字节在压缩映像中都将替换为 12 位(1.5 个字节)。
GBase 8s 尝试捕获最佳的可压缩模式(模式频率乘以长度)。数据通过以下方法压缩:将
出现的模式替换为字典中的相应符号数,并将出现的不匹配任何模式的字节替换为特别保
留的符号数。
数据库空间中表或分段的所有字典都存储在该数据库空间中一个隐藏的字典表内。
sysmaster 数据库中的 syscompdicts_full 表和 syscompdicts 视图提供有关压缩字典的信
息。
通常需要大约 100 KB 的空间来存储压缩分段或表的压缩字典。因此,太小的表不适合压
缩,因为可能无法通过压缩行来收回足够抵销压缩字典存储花费的空间。
此外,GBase 8s 不能将单个行压缩到长度小于 4 个字节。这是因为服务器必须留出一些
空间,
以免行映像稍后增长到超过了页面可容纳的程度。
因此,
不得尝试压缩带有包含 4 个
或更少字节的行的分段或非分段表。

可查看的压缩信息
可以使用 GBase 8s 实用程序、sysmaster 数据库表和 sysmaster 视图来显示压缩统计信
息、有关压缩字典的信息,以及压缩字典。
表 1. 用于显示压缩信息的实用程序、sysmaster 表和视图

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 259 -
实用程序、表或视图
描述
oncheck -pT 选项
在输出的
“Compressed Data Summary”
部分中显示有关任何压
缩项的统计信息。如果未压缩任何项,那么输出中不会显示
“Compressed Data Summary”部分。
例如,对于行数据,oncheck
-pT 显示表或表分段中任何压缩
行的数量,以及压缩的表或表分段行的百分比。
onlog -c 选项
使用压缩字典来扩展压缩的数据,
并显示压缩日志记录的未压
缩内容。
onstat –g dsk 选项
显示有关当前运行的压缩操作的进度的信息。
onstat -g ppd 选项
显示有关当前打开的压缩分段(也称为分区)存在的活动压缩
字典的信息。此选项显示的信息与 sysmaster 数据库中的
syscompdicts 视图显示的信息相同。
sysmaster 数据库中的
syscompdicts_full 表
显示有关压缩字典和压缩字典二进制对象的元数据。
只有用户 gbasedbt 可访问此表。
sysmaster 数据库中的
syscompdicts 视图
与 syscompdicts_full 表显示的信息相同,不过出于安全性原
因,其中不包含 dict_dictionary 列,该列中包含压缩字典二
进制对象。
可以使用 UNLOAD 语句,
将压缩字典从 syscompdicts_full 表卸载到压缩字典文件,
如下
所示:
UNLOAD TO 'compression_dictionary_file'
SELECT * FROM sysmaster:syscompdicts_full;
有关 onlog 实用程序、onstat -g dsk 选项、onstat -g ppd 选项、oncheck -pT 选项、
syscompdicts_full 表和 syscompdicts 视图的更多信息,请参阅《GBase 8s 管理员参考》。

GetString 方法
得到指定列的String 值。

重载列表
1) 根据给定的序号,得到指定列的String 值。



GBase 8a 程序员手册ADO.NET 篇
南大通用数据技术股份有限公司

- 237 -
GetString(Int32)
2) 根据给定的列名称,得到指定列的String 值。
GetString(String)

ifx_int8soasc() 函数将 int8 类型数值转换为 C char 类型值。
语法

mint ifx_int8soasc(int8_val, strng_val, len)
ifx_int8_t *int8_val;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 747 -
char *strng_val;
mint len;
int8_val
指向 ifx_int8soasc() 将其值转换为文本字符串的 int8 结构的指针。
strng_val
指向 ifx_int8soasc() 放置文本字符串处的字符缓冲区的第一个字节的指针。
len
以字节计算的 strng_val 的大小,对于空终止符,为负 1。
用法
如果 int8 数值不适于放入长度 len 的字符串内,则 ifx_int8soasc() 将该数值转换为
指数计数法。如果该值仍不适合,则 ifx_int8soasc() 以星号填充字符串。 如果该数值比字
符串短,则 ifx_int8soasc() 向左对齐该数值,并用空格填充它的右边。
由于 ifx_int8soasc() 返回的字符串不是以空终止的,因此,在您打印它之前,您必须
将空字符添加到该字符串。
当您使用非缺省的语言环境(US English 之外的一种)时,ifx_int8soasc() 支持
strng_val 字符串中的非 ASCII 字符。要获取更多信息,
返回代码
0
转换成功。
-1207
被转换的值不适于放入分配了的空间内。
示例
demo 目录中的文件 int8soasc.ec 包含下列样例程序。
/*
* ifx_int8soasc.ec *

The following program converts three string
constants to INT8 types and then uses ifx_int8soasc()
to convert the INT8 values to C char type values.
*/

#include
#define END sizeof(result)

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

EXEC SQL include "int8.h";

char string1[] = "-12,555,444,333,786,456";
char string2[] = "480";
char string3[] = "5.2";
char result[40];

main()
{
mint x;
ifx_int8_t num1, num2, num3;

printf("IFX_INT8sOASC Sample ESQL Program running.\n\n");

if (x = ifx_int8cvasc(string1, strlen(string1), &num1))
{
printf("Error %d in converting string1 to INT8\n", x);
exit(1);
}
if (x = ifx_int8cvasc(string2, strlen(string2), &num2))
{
printf("Error %d in converting string2 to INT8\n", x);
exit(1);
}
if (x = ifx_int8cvasc(string3, strlen(string3), &num3))
{
printf("Error %d in converting string3 to INT8\n", x);
exit(1);
}
printf("\nConverting INT8 back to ASCII\n");
printf(" Executing: ifx_int8soasc(&num1, result, END - 1)");
if (x = ifx_int8soasc(&num1, result, END - 1))

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 749 -
printf("\tError %d in converting INT8 to string\n", x);
else
{
result[END - 1] = '\0'; /* null terminate */
printf("\n The value of the first INT8 is = %s\n", result);
}
printf("\nConverting second INT8 back to ASCII\n");
printf(" Executing: ifx_int8soasc(&num2, result, END - 1)");
if (x= ifx_int8soasc(&num2, result, END - 1))
printf("\tError %d in converting INT8 to string\n", x);
else
{
result[END - 1] = '\0'; /* null terminate */
printf("\n The value of the 2nd INT8 is = %s\n", result);
}

printf("\nConverting third INT8 back to ASCII\n");
printf(" Executing: ifx_int8soasc(&num3, result, END - 1)");
/* note that the decimal is truncated */

if (x= ifx_int8soasc(&num3, result, END - 1))
printf("\tError %d in converting INT8 to string\n", x);
else
{
result[END - 1] = '\0'; /* null terminate */
printf("\n The value of the 3rd INT8 is = %s\n", result);
}
printf("\nIFX_INT8sOASC Sample Program over.\n\n");
exit(0);
}
输出

IFX_INT8sOASC Sample ESQL Program running.

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


Converting INT8 back to ASCII
Executing: ifx_int8soasc(&num1, result, sizeof(result)-1)
The value of the first INT8 is = -12555444333786456

Converting second INT8 back to ASCII
Executing: ifx_int8soasc(&num2, result, sizeof(result)-1)
The value of the 2nd INT8 is = 480

Converting third INT8 back to ASCII
Executing: ifx_int8soasc(&num3, result, END)
The value of the 3rd INT8 is = 5