jillme
作者jillme课题专家组·2011-05-07 00:09
CIO·某大型银行

开发优质高效的INFORMIX数据库应用程序(二)

字数 4541阅读 2176评论 0赞 0
二、 数据库、表创建方式的优化 
在数据库建模初期应该充分考虑创建库表的策略。若等到程序设计好之后,再改动库表结构则需要修改程序,这样在时间成本和风险上代价是很高的。 
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比其它数据的处理的效率要低。 
◆ 有时为了获得所需的性能,减少连接运算而设计非常规数据模型是必要的,但这是最后的解决办法。 

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广