X
首页 数据库管理 Informix 11.5 行压缩及存储优化技术应用实践1(11.5新功能)
Informix 11.5 行压缩及存储优化技术应用实践1(11.5新功能)

从 Informix 11.5 xC4 开始,Informix 数据库提供了行压缩技术。本文主要向大家介绍为什们需要行压缩技术,它的优势是什么,行压缩技术的基本原理是什么,在 Informix 11.5 数据库中如何使用行压缩技术,以及如何对行压缩操作进行监控。通过上述的介绍,希望能够使大家对 Informix 11.5 数据库行压缩技术有一个比较全面的了解。
我们知道,从 Informix 11.5 xC4 开始,Informix 数据库提供了行压缩技术,它采用一种静态的基于字典的压缩算法,将表(table)或表分区(table fragments)中的数据行中重复的数据模式映射到一个占用空间较少的符号,从而减少表格或表分区数据的总大小。这些重复的数据模式不仅可以是一列中的数据,也可以是一列中的部分数据,甚至可以是跨数据列的数据。通过采用行压缩技术,Informix 11.5 可以节省高达 80% 的存储空间。同时,由于数据是采用压缩方式存储,I/O 读取效率会有 20% 左右的提高,内存使用效率会更高,数据库备份及恢复的时间也得到相应的减少。


图 1. 采用行压缩技术的示意图
 

上图中,我们发现,smpo 在数据行中重复出现,在压缩时,我们将其用(01)表示; Dallas TX 75063 同样在数据行中重复出现,在压缩时,我们将其用(02)表示,这样,会节省大量数据空间。

Informix 数据库不仅可以对行数据进行压缩,还可以整合表压缩后的空闲空间,并将该空闲空间归还给数据空间重复使用。通过采用行数据压缩技术,可以为我们带来如下好处:

大大节省硬盘存储空间
对于表分区(table fragments)压缩,减少了磁盘的使用
节省了逻辑日志的使用,从而节省更多的空间,并可以防止高吞吐量的联机事务处理出现瓶颈
数据页读取更少,因为一个数据页上可以容纳更多的行
需要规模较小的缓冲池,因为同样大小的缓冲池可以容纳更多的数据
I/O 活动会更少:在一个数据页上会容纳更多的数据,对 insert, update, 及 delete 操作的日志记录会更小
在分区表环境,可以将不经常访问的历史数据分区进行压缩,而对经常访问的数据分区不进行压缩
可以释放表中不再需要的空闲空间
更快速的数据库备份及恢复
行压缩技术比较适合于 I/O 操作密集型的表,特别是缓冲池命中率较低的情况。在 OLTP 环境下,对 I/O 操作密集型的表进行行压缩,会显著提高处理性能。如果应用程序缓冲池命中率较高,而且高性能比磁盘空间的使用更重要,这时,采用行压缩技术就不太合适,因为压缩会降低处理性能。

采用行压缩技术,由于一个数据页上可以容纳更多的行,因此,数据库优化器会采用和未进行行压缩处理不同的执行计划。

如果你在使用数据库复制技术 ER,在一个复制服务器上对数据进行压缩,不会影响在其他复制服务器上的数据。

如果你在使用 High-Availability Data Replication (HDR), 在源对数据进行压缩,在目标同样会对数据进行压缩。你不能在 HDR secondary, RS secondary, or SD secondary server 上对数据进行压缩,因为 HDR 目标服务器上的数据必须和源上的一样。

哪些数据可以被压缩

我们通常会对表或表分区中具有重复模式的数据进行压缩。行压缩对数据类型没有任何限制,一般来讲,文本数据会比数值类型更容易被压缩,因为文本类型数据中会更容易包含重复模式。但我们不能仅仅根据数据类型来预测数据压缩比。

比如说:

对于存储在 char 或 varchar 字段中的文本数据,采用不同的语言或字符集,数据压缩比往往都不同
对于数值类型数据,如果存在大量的 0,往往压缩效果会好,但对于包含大量不同数值的数据,压缩效果不会太好
数据中包含大量空格的数据压缩效果会好
数据已经采用不同的压缩算法压缩之后,压缩效果不会太好

 

哪些数据不能够被压缩

我们不能对下边数据进行压缩:

在 sysmaster, sysutils, sysuser, syscdr, syscdcv1 数据库中的表或表分区
Catalogs
临时表
虚拟表接口表(Virtual-table interface tables)
A tblspace tblspace
Internal partition tables
数据压缩字典表(Dictionary tables)
Indexes
保存在数据行外边的 LOB 数据


使用行数据压缩及存储优化技术的基本步骤

当执行行数据压缩及存储优化任务时,用户必须能够连接到 sysadmin 数据库,并且必须是数据库服务器管理员(DBSA )。通常,只有 informix 用户可以执行上述操作。

使用行数据压缩及存储优化技术主要包含以下步骤:

评估使用行压缩技术的压缩比
激活实例级数据压缩功能
创建数据压缩字典
压缩表或表分区中的行数据
整合表或表分区数据(Repack the table or fragment rows)
回收空闲空间(Reclaim free space)
评估使用行压缩技术的压缩比

在对表或表分区进行压缩前,我们可以使用 estimate_compression 命令评估一下,使用压缩功能会节省多少空间。评估的结果是根据数据抽样得出的,实际的压缩比可能与评估的结果不太一样。

下面例子显示了使用 estimate_compression 命令进行压缩评估的方法:

execute function sysadmin:task(‘table estimate_compression’,’orders1);
 

 (expression)  est   curr  change partnum    table
              ----- ----- ------ ---------- -----------------------------------
              87.5%  0.0%  +87.5 0x0010017a stores:informix.orders1

              Succeeded: table estimate_compression  stores:informix.orders1
   
   


上边例子显示出,我们可以对 orders1 表进行 87.5% 的压缩(est 列),当前的压缩比是 0.0%(curr 列),change 列显示压缩比可以改变的压缩比是多少。

我们还可以使用 estimate_compression 命令的其他选项来进行压缩评估:

execute function sysadmin:admin(‘table estimate_compression’,’orders1);

execute function sysadmin:task(‘fragment estimate_compression’,‘0x500003’);

execute function sysadmin:admin(‘fragment estimate_compression’,‘0x500003’);
   
   

激活实例级数据压缩功能

在压缩数据之前,我们要先激活数据压缩功能。对于数据库服务器,我们只需激活一次。如果我们仅仅是要对数据压缩进行评估,我们不需要激活数据压缩功能。同样,如果我们使用 repack 或 shrink 命令释放空闲空间,我们也不需要激活数据压缩功能。

激活数据压缩功能,我们可以使用如下命令:

execute function sysadmin:task(‘enable compression’);

execute function sysadmin:admin(‘enable compression’);
   
   

当实例激活数据压缩功能后,如果需要迁移到以前不支持压缩功能的版本,我们需要将数据进行解压缩或删除被压缩的表。

创建数据压缩字典

在 Informix 11.5 中,我们会为每一个被压缩的表或表分区建立一个数据压缩字典。在数据压缩字典中,保存重复的数据模式及相应的一个占用空间较少的符号。数据压缩字典会根据表或表分区中的数据随机抽样来创建,但数据必须至少 2000 行,不足 2000 行数据的表或表分区将不会创建数据压缩字典。数据压缩字典可以最多保存 3840 个数据模式,每一个数据模式的长度可以是 2 字节到 15 字节。在行压缩过程中,每一个数据模式会由一个 12 位(12-bit)的符号数字来代替。

Informix 会尝试选择最佳的数据模式进行压缩。数据压缩字典被保存在隐藏的字典表中。我们可以通过查询 sysmaster 数据库中的 syscompdicts_full 表或 syscompdicts 视图来获得数据压缩字典的相关信息。

通常,数据压缩字典会大约占用 100KB 的空间,因此,比较小的表不太适合进行压缩。另外,如果表或表分区中的数据行小于 4 个字节,Informix 也不会对其进行压缩。

当我们创建好数据压缩字典后,任何新插入或被修改的行都会被压缩。已经存在的行不会被压缩。

下面例子显示了使用 create_dictionary 命令创建数据压缩字典的方法:

execute function sysadmin:task(‘table create_dictionary’,’orders1’);
execute function sysadmin:admin(‘table create_dictionary’,’orders1’);

execute function sysadmin:task(‘fragment create_dictionary’, ‘0x500003’);
execute function sysadmin:admin(‘fragment create_dictionary’, ‘0x500003’);
   
   


压缩表或表分区中的行数据

当执行 compress 命令对表或表分区数据进行压缩时,Informix 根据数据压缩字典对表或表分区中的所有数据进行压缩。如果数据压缩字典没有存在,压缩操作会帮我们创建一个数据压缩字典。当有新的数据插入或修改时,Informix 会自动按照数据压缩字典进行相应的压缩。

如果表中的数据发生了显著的变化,我们考虑数据压缩字典是按照旧数据来构建的,我们可以对数据进行解压缩,再重新进行压缩操作。

下面例子显示了使用 ccompress 命令压缩数据的方法:

execute function sysadmin:task(‘table compress’,’orders1’);
execute function sysadmin:admin(‘table compress’,’orders1’);

execute function sysadmin:task(‘fragment compress’, ‘0x500003’);
execute function sysadmin:admin(‘fragment compress’, ‘0x500003’);

   
整合表或表分区数据(Repack the table or fragment rows)

repack 命令相当于磁盘的碎片整理工具,将表或表分区中的数据都迁移到最前边,将空闲空间整合到一块。由于 repack 操作在移动数据的同时,允许用户访问相应的表或表分区,因此,当采用低于 Repeatable Read 隔离级别的查询会产生幻想读的问题。为了解决这个问题,我们可以使用 Repeatable Read 隔离级别或者使用repack_offline命令。

下面例子显示了使用 repack 命令整合数据的方法:

execute function sysadmin:task(‘table repack’,’orders1’);
execute function sysadmin:admin(‘table repack’,’orders1’);
 
execute function sysadmin:task(‘fragment compress’, ‘0x500003’);
execute function sysadmin:admin(‘fragment compress’, ‘0x500003’);
 
execute function sysadmin:task(‘table repack_offline’,’orders1’);
execute function sysadmin:admin(‘table repack_offline’,’orders1’);

execute function sysadmin:task(‘fragment repack_offline’, ‘0x500003’);
execute function sysadmin:admin(‘fragment repack_offline’, ‘0x500003’);
   
   
回收空闲空间(Reclaim free space)

shrink 命令用于将空闲空间归还给数据空间重复使用,这样可以减少表或表分区的空间占用。

下面例子显示了使用 shrink 命令回收空闲空间的方法:

execute function sysadmin:task(‘table shrink’,’orders1’);
execute function sysadmin:admin(‘table shrink’,’orders1’);
 
execute function sysadmin:task(‘fragment shrink’, ‘0x500003’);
execute function sysadmin:admin(‘fragment shrink ’, ‘0x500003’);
   
   


我们可以在一个命令中执行上述命令选项的任意组合,但数据库服务器按照下边的顺序进行执行:

create_dictionary compress repack shrink
   
   


下面例子显示在一个命令中执行命令选项组合的方法:

execute function sysadmin:task(‘table compress  repack shrink’,’orders1’);
execute function sysadmin:task(‘table compress  repack’,’orders1’);
execute function sysadmin:task(‘table compress  shrink’,’orders1’);
execute function sysadmin:task(‘table  repack shrink’,’orders1’);

   
数据解压缩

我们可以使用 uncompress 命令对表或表分区中的数据进行解压缩、阻止对新插入或修改的数据进行压缩及禁用数据压缩字典。同样,由于 uncompress 操作在移动数据的同时,允许用户访问相应的表或表分区,因此,当采用低于 Repeatable Read 隔离级别的查询会产生幻想读的问题。为了解决这个问题,我们可以使用 Repeatable Read 隔离级别或者使用 uncompress_offline 命令。

下面例子显示了使用 uncompress 命令解压缩数据的方法:

execute function sysadmin:task(‘table uncompress  ’,’orders1’);
execute function sysadmin:task(‘table uncompress_offline’,’orders1’);
execute function sysadmin:task(‘fragment uncompress’, ‘0x500003’);
   

删除非活动的数据压缩字典

我们可以使用 purge_dictionary 命令删除非活动的数据压缩字典。在删除非活动的数据压缩字典之前,我们需要解压缩表或表分区中的压缩数据。当我们执行解压缩操作时,数据压缩字典会变成非活动状态,此时,我们可以删除它。

下面例子显示了使用 purge_dictionary 命令删除非活动的数据压缩字典的方法:

execute function sysadmin:task(‘table purge_dictionary’,’orders1’);
execute function sysadmin:task(‘fragment purge_dictionary’, ‘0x500003’);

<下一页>