INIX数据库培训教材(高级).doc

上传人:自*** 文档编号:126899018 上传时间:2020-03-28 格式:DOC 页数:21 大小:101KB
返回 下载 相关 举报
INIX数据库培训教材(高级).doc_第1页
第1页 / 共21页
INIX数据库培训教材(高级).doc_第2页
第2页 / 共21页
INIX数据库培训教材(高级).doc_第3页
第3页 / 共21页
INIX数据库培训教材(高级).doc_第4页
第4页 / 共21页
INIX数据库培训教材(高级).doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《INIX数据库培训教材(高级).doc》由会员分享,可在线阅读,更多相关《INIX数据库培训教材(高级).doc(21页珍藏版)》请在金锄头文库上搜索。

1、INFORMIX数据库培训教材(高级)第一部分:INFORMIX数据库性能调整一程序及数据的性能调整1. 索引在数据库中,索引对效率的影响可以说是决定性的。所以,索引使用的好坏直接影响系统的效率。每一索引的建立都要根据系统的使用综合考虑,哪些语句使用最频繁,这些语句的where 条件是什么,对当前表的更新频率如何。在索引的建立过程中,能够建成 unique 索引的,最好建成unique 索引,举例说明:假设在业务系统中,check_info 表是核保信息表,有保单号(bm_cert)字段,在投保单登录前,此字段无值。若将此字段置为空,则登录前的投保单的保单号(bm_cert)均为空,就不能建唯

2、一索引。此时若改变策略,将投保单时的保单号置为投保单号,(投保单号与保单号不会重复),则bm_cert 字段就可建唯一索引,大大提高了连表查询速度。对唯一索引可根据需要建成聚类,语法如下: create cluster index id_person on person(insure_nu); alter index id_person to cluster alter index id_person to not cluster聚类使数据的物理存储顺序与索引一致,减少取数的读盘次数,从而提高效率。2. 关于with hold 在游标中,如果在循环体内使用了事物,该游标的声明必须使用with

3、hold 。否则该游标在事物后会被关闭。为此,可能习惯在声明游标时加上with hold,不管内部是否有事物。这种做法对单处理器机器可能没什么影响,但对多处理器机器就有影响了。因为使用with hold 后,就不能使用并行查询。也就是说,用了with hold 后,pdq 不能起作用。因此,对于游标内未使用事物的,建议最好不要使用with hold。3. 关于隔离级别隔离级别设成脏读,可提高查询速度。若对某表查询,而该表的更新频率较高,这时在查询前 设置 set isolation to dirty read 可使查询速度大大提高。但要注意脏数据。有两种情况可以这样使用 (1) 不怕读到脏数据

4、,有脏数据也没有关系。(2) 确信读不到脏数据。例如,假设在业务系统中,对rtdz2(单证状态表)表的更新比较频繁,而且此表的记录数也比较多,在很多情况下又要对该表进行实时查询。在更新时要锁记录,那么查询只好set lock mode to wait ,这样查询速度将会受到很大影响。只好将隔离级别设成脏读。为了保证实时数据不是脏数据,那么我们必须确保一点:系统中所有对rtdz2的更新的语句都在事物的最后一句。而业务系统中已经做到了这一点。事实证明,此处效率的提高是显著的。4. 关于事物事物的作用相信大家都明白,这里就不再说明了。但在使用事物的时候,为了尽量减少锁表时间,事物中的语句应尽量少。因

5、此在begin work 内最好只有更新语句 update, delete , insert 等。而一些预备工作如查询,计算等都应放在begin work 外。5.关于数据分割当某一表的数据量较大时,可考虑用数据分割的方式来提高效率。数据分割就是将某一表的数据根据一定的条件放入不同的 dbspace ,若这些不同的dbspace 在不同的物理盘上效果会更好 。数据分割的用法如下所示:create table rta14 ( bm_cert char(15), bm_type char(6), bm_way char(1), je_pay decimal(12,2), rq_payto date

6、, rq_lqstart date, flag char(5), age_min smallint, age_max smallint, lj_pay decimal(16,2) ) fragment by expression (bm_cert = 990999999999999 ) ) in datadbs1 , (bm_cert 002999999999999 ) AND (bm_cert 099999999999999 ) AND (bm_cert 599999999999999 ) AND (bm_cert = ”00301010000000000000” and bm_cert=

7、003010100000000 and bm_cert= 003010100000000 显示与第一个写法无明显差别,实际上第二种写法效率远远高于第一种。实际测试第一种写法的时间需要 2分41秒而第二种写法的执行时间只需14秒。因此,程序中最好不要使用 bm_certx,y=”?” 这种形式,而改为bm_cert=”?” 这种形式。 (2). 在程序中,我们经常做这样的工作,先判断表内是否有该条数据,如果有就update 该条数据,否则就插入一条。一般都写成如下形式: select from where key=t_key if status=notfound then insert into

8、 else update end if 实际上,写成如下形式效率更高update where key=t_keyif status=0 and sqlca.sqlerrd3=0 then insert into end if 因为当该条数据存在时,只做一次写操作。 (3). 在应用系统中有这样一条SQL语句。 select print_name from validate_item where (acc_book_type = t_acc_book_type and acc_book_code = t_acc_book_code and (center_code = t_center_code

9、 or center_code=”000000”) and item_code = t_item_code and direction_idx = t_dir_idx_val1 and direction_other = t_dir_oth_val1) ( validate_item 表中 acc_book_type , acc_book_code , center_code , item_code , direction_idx , direction_other 为唯一索引) 该语句的效率不高,改写为以下形式后效率得到了很大提高。在存储过程中,上面的写法此存储过程执行需用时1 分多钟,改为

10、下面的写法后,用时仅需1秒 select print_name into t_str from validate_item where (acc_book_type = t_acc_book_type and acc_book_code = t_acc_book_code and center_code = t_center_code and item_code = t_item_code and direction_idx = t_dir_idx_val1 and direction_other = t_dir_oth_val1) or (acc_book_type = t_acc_book

11、_type and acc_book_code = t_acc_book_code and center_code = 000000 and item_code = t_item_code and direction_idx = t_dir_idx_val1 and direction_other = t_dir_oth_val1);在SQL 语句中,where 条件中有or 的 语句,where 条件尽量用大组合,而不要用小组合。8 关于使用 put , execute来代替 insert 提高效率 在做数据转换或登录大批量数据时,用put 或 execute 替代insert ,将使效率大幅度提高。因为在循环体内,减少了对insert 的语法检查及预处理的时间。 Put 的用法如下: let t_pre_1 = insert into rt

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号