Chinaunix首页 | 论坛 | 博客
  • 博客访问: 91311890
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-05-26 08:35:21

 

作者 傅凯文/库柏信息   

 

这篇文章介绍 Informix Dynamic Server 数据重组对系统效能的影响和数据重组的流程步骤。

前言

使用过 Microsoft Windows 系列操作系统的人,一定听过「磁盘重组」(disk defragment) 或是使用过操作系统里内建的「磁盘重组工具」(Disk Defragmenter)

到底什么是磁盘重组呢? 为什么计算机磁盘会需要重组呢?

系统在将数据写入磁盘时并无法确保数据可以写在连续的磁盘空间上;而磁盘上的数据分散各处会降低系统的整体效能。数据在分散的情况下,要读写数据时,计算机必须反复搜寻散落在硬盘上的数据片段,把分散的片段连起来,这时系统响应时间就会大幅度地拉长。

Windows 系列操作系统提供了一公用程序「磁盘重组工具」,可以分析本机磁盘区并合并分散的档案及数据夹,让每个档案及数据夹都能尽量各自占据磁盘区上单一且连续的空间。若档案或资料夹可以紧密地储存在一起而没有被分割,读取及写入磁盘的速度就会加快;藉由合并档案及数据夹,磁盘重组工具也可以合并磁盘区的可用空间,减少新档案形成分散的情况。合并分散档案及数据夹的过程即称作磁盘重组。

Informix 资料重组

IBM Informix® Dynamic Server (以下简称 IDS) 数据库的磁盘管理功能划分磁盘以 extents 形式建构及存在,它亦有类似数据分散存在的问题。

当一个 table 的数据不断增加,同一个 table extents 一定会出现类似档案区块般分散在磁盘各处的现象。早期建构的 table 因使用原始容积量 (default extent size),而造成 extents 细小而数量庞大。这样细小而数量庞大的 extents 使 IDS 必须反复搜寻散落在硬盘上的 extents ,把分散的片段连起来以成就大量读取,这时 IDS 系统响应时间就会大幅度地拉长。为暂时解决这个问题,可以透过指令调整之后 extent 的大小,减慢 extent 块数增加的速度。

ALTER TABLE table_name  MODIFY NEXT SIZE new_extent_size;

  new_extent_size 的单位为 Kilobytes (KB)  

但是 ALTER TABLE 指令并不能解决先前已经配置的 extents 做调整。为增进 IDS 数据库的磁盘管理功能,数据库管理人员 (DBA) 必须定期针对成长快速的table做「IDS数据重组」,在执行 IDS 数据重组后将彻底根治细小而数量庞大 extents 的问题;在多数的情况下,对数据库存取的效能也会增加。那要如何执行「IDS 数据重组」呢? 所谓的「IDS 数据重组」,是指 table level extents 能连续摆放在一起。重组的步骤如下:

Informix 数据重组步骤

1.首先为了确保不会有其它人继续存取此 table ,先将此 table 更名为另一个新名字。

2.根据原 table schema ,推算出目前此 table 的容量。此容量值加上 table 的成长率,即为新 table first extent 大小。(举例来说, table A 的一笔资料为 1.5 KB ,目前 table A 有一万笔资料,所以目前 table A 的容量就有 15 MB 。但是为了让 table A 能继续长大,可以将 first extent 设为 18~20 MB

CREATE TABLE table_name(    …)EXTENT SIZE first_extent_size NEXT SIZE next_extent_sizeWITH LOGLOCK MODE ROW;

3.使用 table schema 加上刚才算出来的 first extent 大小来建立新的 table first_extent_size next_extent_size 的单位皆为 Kilobytes (KB)

4 透过 INSERT INTO ... SELECT ... 的方式,将原本 table 的数据复制一份到新建立的 table中。

INSERT INTO new_table_name SELECT * FROM table_name;

5. 最后将新建立的 table 更名回原 table 的名字,就可以让使用者继续使用了。

经验分享

所以当一 table extents 块数接近上限值时,为了不影响数据后续的新增,强烈建议尽快安排时间做数据重组的动作。在一般的情况下,定期针对各 tables 做数据重组的动作为数据库管理人员的责任。为了让系统效能可以明显提升,针对平常读写次数最频繁的 table 先做重组,会是一个理想的选择。

结论

正如先前步骤所提到,这种重组做法最大的缺点就是必须限制使用者暂时不存取该 table IBM 在线的文件有提到使用 UNLOAD/LOAD 的工具复制数据,这种做法在特殊的编码数据时有可能会影响数据的正确性;所以还是建议使用 INSERT INTO ... SELECT ... 的方式。在 IDS 中,对 table extents 的块数有一定的上限制。一般来说,超过 210 extents 的时候有可能会无法再配置新的 extent 给该 table ,将会导致数据无法继续新增。

(注:在 AIX 机器上的 extents 块数上限为 450 左右。)

参考数据

-   磁盘重组工具概观

-   IBM Informix Dynamic Server Performance Guide

 

阅读(957) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~