X
首页 数据库性能优化 开发优质高效的INFORMIX数据库应用(1)
开发优质高效的INFORMIX数据库应用(1)

    INFORMIX数据库是一被广泛应用的关系型数据库,如何提高其应用性能是大家关心的话题,特别是随着数据库中数据量与应用处理交易量的不断增多,其运行效率问题尤显突出。众所周知,数据库应用系统的性能优化是一个高度复杂,异常繁琐而且涉及面很广的综合性工作。面对复杂的数据库应用系统性能调优,大家往往感到无从下手。其实对性能调优不外乎从网络、硬件、操作系统、数据库参数和应用程序等方面来考虑。事实上,对网络、硬件、操作系统、数据库参数进行优化所获得的性能提升全部加起来只占数据库应用系统性能提升的40%左右,其余的60%系统性能提升全部来自对应用程序的优化。
本文结合工作实践,从INFORMIX ONLINE参数的配置和性能调整、数据库表创建的方式、索引策略、查询语句(SELECT)优化等方面对INFORMIX数据库应用系统的程序设计和数据维护提出一些优化措施。
一、 INFORMIX ONLINE参数设置的优化措施
INFORMIX数据库系统参数性能调整的优劣直接影响INFORMIX数据库运行效率。在决定进行系统性能调优时,首先应制定一个完整的调优方案,先监控系统并分析出问题所在,然后根据分析结果每次调整一个参数,再进一步监控系统查看系统性能有无变化,然后再做近一步的调节。其中有一个

3、共享内存(Shared Memory)
当调整系统性能时,对于内存的调节要考虑两方面的问题:
◆ 是否有足够的物理内存?
◆ INFORMIX  ONLINE的共享内存配置是否合理?是否充分使用了物理内存?
INFORMIX ONLINE共享内存分为三部分:驻留部分、虚处理部分和消息部分,其中消息部分只有在客户机和服务器采用共享内存方式连接时才有。
可以通过对INFORMIX 共享内存的虚处理部分来看系统是否有足够的物理内存。当前的操作系统和数据库系统都只有一小部分的数据和过程处理在内存中,这一小部分数据页被称之为进程工作组(working  set)。当一个进程工作组改变或其它进程运行时,每个进程工作组需要的内存也许会超出实际内存的容量。这时,一些数据页将被移出实际内存,其它的数据页将被移入。
影响共享内存的几个ONLINE配置参数:
◆SHMVIRSIZE:该参数规定了初始分配给ONLINE的共享内存的虚拟区的大小。共享存储器的虚拟区存储与会话、请求有关的数据及其它信息。虽然ONLINE按处理大型查询或高峰负荷的需要增加共享内存给虚拟区,但共享内存的分配增加事务处理的时间,INFORMIX建议设置SHMVIRTSIZE以提供一个满足一般日常操作需要的虚拟接口。一般50用户设8000KB,100用户设16000KB。
◆SHMADD:该参数规定ONLINE自动加到虚拟区的共享内存增量的大小。在决定该值的大小时有些折中因素。增加共享内存要占用CPU周期:每次的增加量越大,增加次数就越少,留给其它的进程的内存也越少。通常采用大增加量,但当内存负荷很重时,少量增加使其他程序更好的共享内存资源。INFORMIX 有如下建议:
实际内存大小     建议SHMADD值
     <=256MB         8192KB(缺省)
  256-512MB   16,384KB
     >=512MB       32,768KB
◆BUFFERS:该参数可以用于ONLINE的数据缓冲区数。这些缓冲区驻留在驻留区,用来缓存主存中的数据库的数据页。可用的缓冲区越多,所需的数据页就越可能用于前一次请求而已经在内存里。这个参数对数据库I/O和事务处理吞吐量有明显的影响。但是,分配过多的缓冲区会影响内存系统并导致过多的页面活动。
INFORMIX建议设置BUFFERS为物理内存(以MB为单位)的20%到25%。实际BUFFERS的单位为页,不同操作系统的页大小是不同的,因此需要计算。
◆LOCKS:该参数设置任意时刻可用的锁的最大数量。ONLINE中每个锁需要占用驻留共享内存的44个字节,分配共享内存时要考虑锁所用的资源。一般锁可以分配的大些,其范围为:2000至8000000个。
◆LOGBUFF:该参数指定为三个用来保存逻辑日志记录的缓冲区分别保留的共享内存的数量。这些缓冲区保存着逻辑日志记录,直到它们被刷新到硬盘上的逻辑日志文件。缓冲区的大小决定了它被添满的频率,从而决定了它必须被刷新到硬盘上的逻辑文件中的频率。INFORMIX建议设置为16KB或32KB,对于繁忙的应用,可考虑设置为64KB。
◆PHYSBUFF:该参数指定为两个用来暂时保存将被修改的数据页的缓冲区分别保留的共享内存的数量。缓冲区的大小决定了它被添满的频率,从而也决定了它被写到硬盘上的物理日志的频率。最小值为1个页大小,INFORMIX建议16个页大小。
对于OLTP和OLAP系统,INFORMIX ONLINE共享内存的配置和调节有很大不同。
OLTP应用,驻留部分占共享内存的很大部分。基本上驻留部分的缓冲池占物理内存的20%至25%。例如,一个RS/6000机器的物理内存为1024MB,初始应将BUFFER的数目设为(1024MBX20%)/4KB=52428(AIX系统每页大小为4KB);然后继续增加BUFFER的数目直到读caching到95%,写caching达到85%,或系统开始增加数据移出(Page  out)。注意:高cache速率意味着磁盘I/O的减少。
如果是OLAP系统,其典型特征是少量的用户读取大量的数据。这样的操作将会导致共享内存池的持续增长,例如排序池和哈希函数池,这些池存在于共享内存的虚处理部分: 在优化OLAP系统时,虚处理部分的大小应设为物理内存的75%,通过参数SHMVIRTSIZE设置。
4、网络
避免网络拥塞的方法之一是减少网络传输量,或将部分传输量移至别处。下列是减少网络传输量的一些措施。
(1)、配置多张网卡
通过设置有关的定义TCP/IP连接的系统文件,INFORMIX ONLINE可在多个网卡间通讯。下列介绍在UNIX系统下的ONLINE配置的步骤:
◆  在/etc/services文件中为每一网卡加入一项:
        info21    6621/tcp
            info22    6622/tcp
◆  使用不同的IP地址,为本机的每一网卡在/etc/hosts文件中加入一项:
        66.77.9.79  rsibm21
            66.77.9.80  rsibm22
◆  在INFORMIX用户下$INFORMIXDIR/etc/sqlhosts文件中为每一网卡加一项:
        server21  onsoctcp  rsibm21  info21
            server22  onsoctcp  rsibm22  info22
◆  在INFORMIX的onconfig文件中,设置参数:
        DBSERVERNAME        server21
            DBSERVERALIASES    server22
配置完毕后,应用程序可通过指定sqlhosts项的名称或使用环境变量INFORMIXSERVER指定的缺省数据库服务器名称选择某一通往数据库服务器的路径。
(2)、编程方面的考虑
下面是一些能降低网络传输量的编程技术:
◆ 对有成组SQL语句的任务,使用存储例程,因为它们能减少消息的数量和长度。维护数据库的相对完整性,而非将它编码于应用程序中,也能减少网络传输量。
◆ 只返回应用程序需要的数据,筛选所有非必要的行和列。
◆ 在发送与接收数据时,使用传送缓存。
(3)、不同UNIX供应商对TCP/IP参数提供不同级别的控制,以下是可以对性能起作用的参数:
◆ 流式缓冲区的数目。对于客户机/服务器的高负载,多一些缓冲区可以改善性能。
◆ 数据包(Packet)的大小。DSS适用一较大值,一般OLTP用较小值更好。
二、 数据库、表创建方式的优化
在数据库建模初期应该充分考虑创建库表的策略。若等到程序设计好之后,再改动库表结构则需要修改程序,这样在时间成本和风险上代价是很高的。
1、建数据库的日志方式:
◆ No Logging:不能进行事务处理。
◆ Buffered Log:共享缓存满即刷新写入磁盘。
◆ Unbuffered Log:当一个交易完成时即刷新写入磁盘。
    一般我们对实时处理系统日志方式采用Unbuffered Log,在进行大批量数据集中Load或Unload处理时采用No Logging。
2、对数据表空间分配的优化。
数据库由表构成,实际运用中,表是动态变化的,并且有的表增长的很快。当一个表在dbspace中有超过8个交错区间时,就会影响其访问效率,随着交错区间的进一步增多,甚至会恶化成为访问数据库的瓶颈,经常出现系统颠簸现象。具体表现为运行响应时间减慢、备份时间延长,磁盘I/O常居高不下。
通常,一个dbspace有多个chunk,然而并非所有的chunk都得到合理分配,往往是有的chunk根本没用到(因为最初创建数据库时一般会分配充裕的空间),有的chunk中却拥挤不堪、数据表严重交错。为了平衡I/O,提高访问效率,可以将增长较快的表放入单独的一个chunk中。
在实际设计中,对于大数据量(一般>1MB)并且数据增长快速的表,在使用SQL语句Create Table时可以带extent size extent-size和next size next-size两参数,前者指定创建表的初始区间大小,后者指定当初始区间充满后,扩展区间的大小,单位是KB。
在建表前将数据库每张表数据量大小作一估算,以便将表的第一个“extent”(物理上连续的页)空间分配尽量和估算值大小一致,下一个“extent”空间分配则根据表数据的增加量估计值来分配,这样可减少数据分配碎片和空间浪费,提高数据库系统的效率。
例如:
    Create Table Test
        (policyNo  Char(10),
        insuredName   Char(20)
       )
       extent size 100000
       next size 500
该语句建立表test的初始空间有100MB,如数据充满后每次再分配500KB的空间。
3、采用表分片(fragmentation)技术
“表分片”技术允许在表一级对数据存储进行控制。用户可以对表中的记录或索引进行分组,并且存储在不同的位置,这样可以将数据存储到多个磁盘上,从而减少对磁盘I/O的竞争。数据分片的方案以及分片数据所存放的一组dbspace构成了“分片策略”。数据分片有两种基本类型:轮转法分片(Round-Robin)和基于表达式分片(Expression-Based),对于“轮转法分片”,数据是根据轮转法方式存入表中的。“基于表达式分片”则根据表中的一个或多个字段对分片的规则进行定义,一般在预知查询条件时采用这种方式,从而避免查询中对某些分片的扫描。
对表中的数据和索引进行分片主要是为了提高应程序的效率,由于INFORMIX动态服务器可以并行地扫描多个磁盘上的数据,从而实现内部查询的并行操作,因此采用“分片”技术可以提高查询效率。内部查询的并行化有助于减少对一个复杂查询的响应时间。“表分片”技术与并行数据查询(PDQ)特征联系在一起使用,这样INFORMIX服务器可以分配多条线索。从所有数据分片上并行地选取数据。此外,还可以仅仅对包含“目标数据”的数据分片进行扫描。从而大幅度地提高了整个系统效率。
我们通过大量的数据分片将数据分布在许多的磁盘上,也实现了外部查询的并行操作。这样在大量用户对同一个表进行访问时,可以减少I/O的竞争,每秒钟完成的事务数(系统吞吐能力)也得到了提高。“表分片”技术还通过对存储在dbspace上的数据分片进行备份/恢复操作。
“数据分片”的目标包括最大程度的内部查询并行化、外部查询并行化、提高数据可用性、更细的备份/恢复粒度以及更强的数据加载效率。
使用“表分片”技术的基本原则:
①.对于联机事务处理系统(OLTP),应分片索引,减少会话竞争。
②.对于决策支持系统(DSS),应增加分片表,但不分片索引,分离索引,并把它们放在分离的dbspace中。
③.DSS查询顺序读表,使用轮转法分片(Round-Robin)模式。
④.如果大多请求只存取表中的部分数据,建立基于表达式分片(Expression-Based)。
⑤.保持分片表达式的简单性。
⑥.调整分片表达式,减少测试。如:order_num>=1 AND order_num<=10000 IN dbspace改为order_num<=10000 AND order_num>=1 IN dbspace,效率会更高。
⑦.避免需要数据类型转换的表达式。
⑧.不对改变频繁的字段进行分片。
⑨.不要分片所有表,识别出存取最频繁的关键表。
⑩.不要分片小表。

举例说明两种类型的“表分片”技术使用方法:
(1)、轮转法分片(Round-Robin)
◆建立数据表时指定:
CREATE TABLE my_orders (
order_num SERIAL(1001),
order_date DATE,
ship_instruct CHAR(40),
...)
FRAGMENT BY ROUND ROBIN IN dbspace1, dbspace2, dbspace3
◆将未作分片的数据表改为分片:
          ALTER FRAGMENT ON TABLE my_orders INIT  FRAGMENT
          BY  ROUND  ROBIN  IN  dbspace1,dbspace2,dbspace3
(2)、基于表达式分片(Expression-Based)
◆建立数据表时指定:
CREATE TABLE my_orders (
order_num SERIAL(1001),
order_date DATE,
ship_instruct CHAR(40),
...)
FRAGMENT BY EXPRESSION
order_num < 10000 IN dbspace1,
order_num>=10000 AND order_num < 20000 IN dbspace2,
REMAINDER IN dbspace3
◆将未作分片的数据表改为分片:
          ALTER FRAGMENT ON TABLE my_orders INIT  FRAGMENT
BY EXPRESSION
order_num < 10000 IN dbspace1,
order_num>=10000 AND order_num < 20000 IN dbspace2,
REMAINDER IN dbspace3
4、建表时对表的记录锁方式根据应用处理的不同区别对待。
批量处理的表采用页锁(page)方式,实时交易的表采用行锁(row)方式。锁方式可以在建表时确定,也可以用alter tabname lock mode(row)和alter tabname lock mode(page)命令改变。值得注意的是通过dbimport、dbexport转移生成的表其默认锁方式是页级锁,对于实时交易且操作频繁的表应改为行级锁方式,使用oncheck -pt命令可查得表的锁方式状态。
5、其他一些创建数据库表应遵循的原则
◆ 保证记录的长度较小,最好要小于一个页的大小,跨越多页的长记录对性能无益。
◆ 在绝对有必要的情况下才使用BLOBS,BLOBS比其它数据的处理的效率要低。
◆ 有时为了获得所需的性能,减少连接运算而设计非常规数据模型是必要的,但这是最后的解决办法。