|
登录注册 |
☦ 上海交通大学论坛 > 数据库 > 浏览当前帖子 | 手机版 关闭左侧栏 |
Oracle基于Client/Server的性能调整[2] |
【返回本版】 【发表帖子】 【回复帖子】 | 浏览量 3975 回帖数 0 |
佛祖拈花 等级 ☆ 楼主 发表于 2011/8/27 10:02:44 编 辑 |
||
1.3 调整磁盘 I/O 磁盘的I/O速度对整个系统性能有重要影响。解决好磁盘I/O问题,可显著提高性能。 影响磁盘I/O的性能的主要原因有磁盘竞争、I/O次数过多和数据块空间的分配管理。 为Oracle数据库服务器创建新文件时,不论是表空间所用的数据文件还是数据事务 登录所用的日志文件,都应仔细考虑数据库服务器上的可用磁盘资源。如果服务器上有 多个磁盘,则可将文件分散存储到各个可用磁盘上,减少对数据库的数据文件及事务日 志文件的竞争,从而有效地改善服务器的性能。对于不同的应用系统都有各自的数据集 ,应当创见不同的表空间分别存储各自应用系统的数据,并且尽可能的把表空间对应的 数据文件存放在不同的磁盘上,这种从物理上把每个应用系统的表空间分散存放的方法 ,可以排除两个应用系统竞争磁盘的可能性。数据文件、事务日志文件分别存放在不同 的磁盘上,这样事务处理执行的磁盘访问不妨碍对相应的事物日志登记的磁盘访问。如 果有多个磁盘可用,将两个事物日志成员放在不同的磁盘驱动器上,就可以消除日志文 件可能产生的磁盘竞争。应把一个应用的表数据和索引数据分散存放不同表空间上,并 且尽量把不同类型的表空间存放在不同磁盘上,这样就消除了表数据和索引数据的磁盘 竞争。 1.4 调整数据库服务器的回滚段 回滚段是一个存储区域,数据库使用该存储区域存放曾经由一个事务更新或删除的 行的原始数据值。如果用户要回滚一个事务所做的改变,那么数据库就从回滚段中读回 改变前的数据并使该事务影响的行改变为它们的原状态。回滚段控制着数据库处理事务 的能力,因而在数据库成功中起着关键性的作用,不管数据库的其它部分设计得多好, 如果它设计得不合理,将会严重影响系统的性能。建立和调整回滚段的原则如下。 1.4.1 分离回滚段 分离回滚段是指单独为回滚段创建一个以上的表空间,使回滚段与数据字典、用户 数据、索引等分离开来。由于回滚段的写入与数据和索引的写入是并行进行的,因此将 它分离出来可以减少I/O争用。如果回滚段与数据不分离,倘若要某个表空间脱机或撤消 ,那么在该表空间中的各个回滚段没有全部脱机之前,不能将这个表空间脱机或撤消。 而一旦该表空间不可用,则该表空间中的所有回滚段也不能使用,这将浪费所有分配的 磁盘空间。所以,独立回滚段可使数据库管理变得容易。回滚段的经常性收缩,使得表 空间的自由块更容易形成碎片。分离回滚段可以减少数据库表空间的碎片产生。 1.4.2 创建不同大小的回滚段群 对于一些联机事物处理,他们一般是频繁地对少量数据进行修改,创建许多小的回 滚段对之有利。每一个事物的入口项只能限于一个回滚段,回滚段应该充分大以容纳一 个完整的事物处理,因此对一些较大型事物,需要较大型的回滚段。极个别脱机处理事 物会产生大量的回滚信息,这时需要一个特大号的回滚段来处理。根据这些理论,在 Oracle数据库服务器中针对上述3种事物处理创建三组:小事物组、较大事物组、特大事 物组等大小不同的回滚段群,并且将之分散到3个不同的表空间上,群内大小相同,应 能满足该组事物处理的最大要求。 1.4.3 创建数量适当的回滚段 一般回滚段数量与并发事物个数有关,以下给出由于并发事物个数而应建立回滚段 的参考数: 并发事物(n) 回滚段数 n<16 4 16 ≤ n<32 8 n≥ 32 n/4 2 调整 Client/Server 模式下的网络 I/O Client/Server环境中的应用处理是分布在客户应用程序和数据库服务程序之间的。 在 Client/Server环境中Client与Server之间的网络I/O是整个系统性能提高的瓶颈, 一个客户应用程序引起的网络I/O越少,应用及整个系统的性能越好。减少网络I/O的最 重要的一条原则:将应用逻辑集中在数据库服务器中。 2.1 使用Oracle数据库的完整约束性 当为应用建表时,应当为一些有特殊要求的数据加上适当的完整性约束,这样就能 实现由数据库本身而不是应用程序来约束数据符合一定的条件。数据库服务器端的完整 约束的执行操作是在比SQL语句级别更低的系统机制上优化,它与客户端无关,只在服 务器中运行,不需在Client 端和Server端之间传递SQL语句,有效地减轻网络I/O负担。 2.2 使用数据库触发器 完整约束性只能实现一些较简单的数据约束条件,对一些较复杂的事物处理规则就 无能为力,这时最好不要在应用程序中实施复杂的程序控制,而是应当采用数据库触发 器来实施复杂的事物规则。数据库触发器能实现由数据库本身,而不是应用程序,来约 束数据符合复杂的事物处理规则,并且容易创建,便于管理,避免大量的网络I/O。 例如:将当前表A中成为历史的记录从A表中转储到历史表B中,表示为Lsbs。 在应用程序中实现: 用数据库触发器实现: Beign Create trigger delete1 Update A set lsbs='T'; After update of lsbs on A Insert into B For each row Select * from A where lsbs='T'; Insert into B Delete A where lsbs='T'; select * from A where :new.lsbs='T'; End; Delete A where :new.lsbs='T'; End delete1; 在应用程序中实现时,所有的SQL命令请求传送的数据都要通过网络在Client端和 Server端进行交换,而不像数据库触发器一样,SQL本身在Server端,不需要通过网络传 输数据。当进行操作的数据量相当大时,并且多个用户同时操作时,通过在应用程序中 实现复杂的控制,必将增大网络I/O的负荷,使整个系统的性能降低,而用数据库触发器 能完全避免这种情况发生。 2.3 使用存储过程、存储函数和包 Oracle的存储过程和存储函数是命名的能完成一定功能并且存储在Server端的PL/SQL 的集合。包是一种把有关的过程和函数组织封装成一个数据库程序单元的方法。它们相对 于应用程序的过程、函数而言,把SQL命令存储在Server端。使用存储过程和存储函数, 应用程序不必再包含多个网络操作的SQL语句去执行数据库服务器操作,而是简单调用存 储过程和存储函数,在网络上传输的只是调用过程的名字和输出结果,这样就可减少大 量的网络I/O。 例如:基表A、B的定义:name char(20);detail char(10);A表100万记录,应用程 序将从基表A中检索detail列符合给出条件的记录,并将之插入基表B。 Declare Cursor cursor1 is select*from A;poin cursor1%type; con1 number(2);res1 char(4)='abcd'; Begin Insert into B values(poin.name,poin.detail);end if; For poin in cursor1 loop End loop;End loop; For con1 in 1..7 loop Commit; If substr(poin.detail ,con1,4)=res1 then End; 如果在Developer/2000 From中按钮触发器直接用PL/SQL实现和把它改写为一个Oracle 存储过程,然后在From中调用此过程实现比较,后者性能显著提高。 在考虑使用上述3种方法时:首先考虑使用完整约束性。对于数据库触发器和存储过程, 如果需要所有访问数据库的程序自动实施一定规则或检查,那么使用数据库触发器;如果只 需对少数的程序实施一定的规则或检查,则可创建一个过程,让有关程序调用这个过程。 (待续) |
1 |
论坛帮助 会员认证删帖申请 联系我们 |