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