目錄 搜尋
oracle知识 ORACLE的数据类型 Oracle技术网—DBMS_Job包的用法 Oracle技术网—Oracle for NT系统实用工具介绍 Oracle技术网—Oracle常见错误代码 Oracle技术网—Oracle常用Script Oracle技术网—Oracle常用数据字典 Oracle技术网—ORACLE数据库简介 Oracle技术网—Oracle特殊包 Oracle技术网—Oracle相关站点 Oracle技术网—哪些初始化参数最影响Oracle系统性能 PL/SQL DBA Oracle7 7.3.2.2 Oracle技术网—listener.log的内容增长很快,是否可以删除重建 Oracle技术网—ORACLE表空间恢复方案 Oracle技术网—Oracle常用系统文件有哪些 Oracle技术网—ORACLE回滚段管理(上) Oracle技术网—ORACLE回滚段管理(下) Oracle技术网—Oracle如何决定使用哪个回退段 Oracle技术网—Oracle数据库的空间管理技巧 Oracle技术网—Oracle数据库碎片整理 Oracle技术网—Oracle数据库有哪几种关闭方式 Oracle技术网—Oracle数据库有哪几种启动方式 Oracle技术网—Oracle预定义角色有哪些 Oracle技术网—ROLLBACK不能回滚的命令 Oracle技术网—查看哪些session正在使用哪些回滚段 Oracle技术网—存储参数(storage子句)含义及设置技巧 Oracle技术网—和权限有关的表有哪些 Oracle技术网—漫谈数据库的启动和关闭 Oracle技术网—哪些初始化参数最影响Oracle系统性能 Oracle技术网—如何备份控制文件 Oracle技术网—如何查出前台正在发出的sql语句 Oracle技术网—如何查看Oracle版本及安装了哪些选项 Oracle技术网—如何查看Oracle数据表的建表语句 Oracle技术网—如何查看SGA区剩余可用内存 Oracle技术网—如何查看各个表空间占用磁盘情况 Oracle技术网—如何查看后台进程 Oracle技术网—如何查看什么时间有哪些数据库对象结构被修改过 Oracle技术网—如何查看数据库的各种数据文件 Oracle技术网—如何查看数据库的字符集 Oracle技术网—如何查看数据文件是否自动扩展 Oracle技术网—如何查看数据文件所在的路径 Oracle技术网—如何查看用户表上的约束内容 Oracle技术网—如何查看用户表所占空间的大小 Oracle技术网—如何查询出primary key和forgen key的关系表 Oracle技术网—如何改变当前联机日志文件的大小 Oracle技术网—如何利用DBMS_SQL包和游标计算当前用户下所有表的行数 Oracle技术网—如何启动ARCHIVELOG模式 Oracle技术网—如何取出某一用户的密码,再原封不动的改回去 Oracle技术网—如何设置BLOCK_SIZE大于2K,如:4K、16K Oracle技术网—如何手工指定使用哪个回退段 Oracle技术网—如何修改internal的口令 Oracle技术网—如何移动控制文件到新的目录中 Oracle技术网—如何移数据库文件 Oracle技术网—如何增加表空间的大小 Oracle技术网—怎样查看init.ora文件 Oracle技术网—怎样查看SGA值 Oracle技术网—怎样查看哪些用户拥有SYSDBA、SYSOPER权限? Oracle技术网—怎样快速查出Oracle 数据库中的锁等待 Oracle技术网—怎样识别IO竞争和负载平衡 Exp vs Imp Oracle技术网—EXP、IMP 命令详解 Oracle技术网—Exp/Imp大量数据 Oracle技术网—Export/Import 使用技巧与常见错误 Oracle技术网—Oracle数据库的备份与恢复 Oracle技术网—如何把数据exp到Sql loader里 Oracle技术网—如何单独备份一个或多个表 Oracle技术网—如何单独备份一个或多个用户 Oracle技术网—如何导入指定表 Oracle技术网—如何建立一个与现存数据库相同,但不包含数据的空库 Oracle技术网—如何在oracle7和oracle8之间exp/imp数据 Oracle技术网—提高ORACLE数据库系统import性能 Oracle技术网—为何我的导出文件只有500K Oracle技术网—自动备份Oracle数据库 Oracle技术网—作Export或Import时,如何记录LOG信息? SQL技巧 Oracle技术网—LONG数据类型使用上的一些说明 Oracle技术网—Oracle8 PL/SQL编程风格与系统性能的提高 Oracle技术网—Oracle8中用户名、表名、列名、索引名...可以用中文命名吗 Oracle技术网—Oracle中如何实现某一字段自动增加1 Oracle技术网—SQL(Structured Query Language)语句分哪几类 Oracle技术网—SQL*PLUS常用命令列表 Oracle技术网—SQL*Plus系统环境变量有哪些?如何修改? Oracle技术网—SQL*Plus中缓冲区命令列表 Oracle技术网—SQL*Plus中能运行哪几种命令 Oracle技术网—SQLPlus中的复制和粘贴技巧 Oracle技术网—查看本用户下的各种对象的SQL脚本 Oracle技术网—查找a表中有,而在b表中没有的记录 Oracle技术网—利用PL/SQL打印ASCII表 Oracle技术网—如何查找、删除表中重复的记录 Oracle技术网—如何对CLOB行字段执行全文检索 Oracle技术网—如何对CLOB字段进行全文检索? Oracle技术网—如何改变表中列的名字 Oracle技术网—如何改变一个字段初始定义的Check范围 Oracle技术网—如何给表、列加注释 Oracle技术网—如何将 primary key 建在其它的表空间上 Oracle技术网—如何删除表中的列 Oracle技术网—如何使‘CREATE TABLE AS SELECT’能支持ORDER BY ? Oracle技术网—如何通过 SQL*PLUS 将符号 & 、'号(单引号) 插入Oracle数据库的表中 Oracle技术网—如何用SQL生成SQL批处理文件 Oracle技术网—如何在PL_SQL中读写文件 Oracle技术网—如何自动生成一个含有20000101至20500101共50年日期的表 Oracle技术网—如何自动生成一个含有2000年01月至2050年01月共50年月份的表 Oracle技术网—删除a表中和b表相同的数据 Oracle技术网—在Oracle快速进行数据行存在性检查 Oracle技术网—怎样查看表的结构 Oracle技术网—怎样改变SQL*Plus启动时默认路径 Oracle技术网—怎样计算表中的记录数 Oracle技术网—怎样在SQL*Plus中使用 '&' 来实现自定义参数变量? Oracle技术网—怎样在查询记录时给记录加锁 Oracle错误 Oracle7 7.3.2.2 Oracle技术网—Oracle 816中如何启动Enterprise Manager Oracle技术网—Oracle Enterprise Manager(OEM)工具中如何以SYSOPER、SYSDBA方式登录 Oracle技术网—ORACLE数据库应用开发常见问题及排除 Oracle技术网—监听器错误 Oracle技术网—联机热备份失败后,如何打开数据库 Oracle技术网—没有备份、只有归档日志,如何恢复数据文件 Oracle技术网—某个数据文件损坏,如何打开数据库 Oracle技术网—如何使用归档日志进行完全恢复 Oracle技术网—如何正确建立TYPE、partition(分区) Oracle技术网—一个控制文件被损坏,如何启动 Oracle技术网—在SQL*Plus中insert进的都是中文的,为什么一存入服务器后,再select出的就是???了 Oracle技术网—重装Oracle服务器后,以前的数据可以恢复吗 Oracle初学者入门 Oracle技术网—Oracle 8.1.6 for Win2000 系统文件解释 Oracle技术网—Oracle 基本知识 Oracle技术网—Oracle8 数据类型 Oracle技术网—what is sql? Oracle技术网—安装、配置后,SQL*Plus操作初步 Oracle技术网—安装Oracle后,经常使用的修改表空间的SQL代码 Oracle安装、删除 Oracle技术网—Oradim工具的用法 Oracle技术网—WINDOWS NT上,如何删除ORACLE SERVICE Oracle技术网—如何连接两台Oracle服务器 Oracle技术网—如何在Windows 2000下将Oracle完全卸载 Oracle技术网—如何在WINDOWS NT上删除所有的Oracle安装? Oracle技术网—手工安装数据库时需要安装那些系统包 Oracle技术网—手工创建数据库的全部脚本及说明 Oracle安全性问题 Oracle技术网—Linux ORACLE 8.1.5漏洞 Oracle技术网—Oracle 8.1.6的oidldapd中的漏洞 Oracle技术网—Oracle8的不安全因素及几点说明 Oracle技术网—Oracle数据库的安全策略 Oracle技术网—Oracle数据库密码文件的使用和维护 Oracle技术网—提高Oracle数据库应用系统安全的举例与分析 数据库安全性策略 Oracle系统设置、优化、连接 《Oracle8 优化技术》摘录 (第一章 安装) 《Oracle8 优化技术》摘录 (第二章 内存/CPU) 《Oracle8 优化技术》摘录 (第三章 输入/输出) Oracle技术网—ASP 中通过OLEDB访问 Oracle 的代码 Oracle技术网—Delphi5 企业版使用BDE访问 Oracle方法 Oracle技术网—oracle database access object Oracle技术网—Oracle基于Client/Server的性能调整 Oracle技术网—PB7 连接 Oracle 的配置方法 Oracle技术网—PB内置Oracle数据库接口的使用方法 Oracle技术网—PHP+Oracle(OCI) 初步 Oracle技术网—PHP4连接Oracle 8i的方法(转译) Oracle技术网—多个数据库时,如何设置默认数据库 Oracle技术网—如何备份Oracle设置 Oracle技术网—如何让你的SQL运行得更快 Oracle技术网—如何修改 SQL*Plus 的启动参数 Oracle技术网—如何在Windosws 2000中安装JSP并访问Oracle Oracle技术网—如何在Windosws 2000中安装perl并访问Oracle Oracle技术网—如何在Windosws 2000中安装PHP4并访问Oracle Oracle技术网—如何在Windosws NT中使用批处理命令自动启动或关闭Oracle Services Oracle技术网—如何在客户端省略输入数据库串,而只输入用户名、密码即可 Oracle技术网—使用Database Configuration Assistant安装第二个数据库 Oracle技术网—修改Oracle7数据库maxdatafiles参数的方法 索引、序列、快照、数据库链路、触发器 Oracle技术网—触发器的几种应用 Oracle技术网—建立触发器时最容易忽略的两个地方 Oracle技术网—快照和触发子结合使用的例子 Oracle技术网—能否通过视图更新表中的数据 Oracle技术网—如何创建一个简单的JAVA存储过程? Oracle技术网—如何创建隐藏IP地址的最后一项的函数? Oracle技术网—如何加密Oracle中的存储过程 Oracle技术网—为什么有时ORACLE数据库不用索引来查找数据 Oracle技术网—我的数据库链路为什么不工作 Oracle技术网—一个建立快照的简单例子 Oracle技术网—怎样创建一个简单的自定义过程并引用 Oracle技术网—怎样手工刷新快照 oracle与其他数据库的比较 MySQL 测试 Oracle技术网—Oracle 和 mysql 的一些简单命令对比参照 Oracle技术网—Oracle8i和Microsoft SQL Server7.0比较 Oracle技术网—比较SQL Server与Oracle、DB2 Oracle技术网—各种数据类型的比较 Oracle技术网—戏说SQL—几种SQL 服务器的比较 关键任务      在Internet上运作公司是一项艰苦的任务 其它知识 OEM常见问题及其解决办法 Oracle 8 资料库函式库 Oracle 资料库函式库 Oracle技术网—Decode()函数使用技巧(NT+IIS+ASP+ORACLE) Oracle技术网—Dual伪列 Oracle技术网—NULL 使用详解 Oracle技术网—OLAP及其多维数据分析 Oracle技术网—Oracle for NT系统实用工具介绍 Oracle技术网—ORACLE 用户的规范化管理 Oracle技术网—user、uid伪列 Oracle技术网—大型数据库设计原则 Oracle技术网—留言簿(带Oracle数据库分页的显示功能) Oracle技术网—漫谈oracle中的空值 Oracle技术网—如何正确利用Rownum来限制查询所返回的行数 Oracle技术网—什么是ROWID,为什么需要它 Oracle技术网—数据库技术考试大纲(中级) Oracle技术网—数据库行业的现状和展望 Oracle技术网—在客户端处理Oracle的数据行加锁问题 如何对CLOB行字段执行全文检索 Developer 2000 Oracle技术网—Developer/2000中各键盘触发子所对应的“按键” Oracle技术网—FORM调用REPORT时,如何去掉report server Oracle技术网—FORM中,Exception(例外)都有哪些,如何书写 Oracle技术网—FORM中,FORM中,如何引入图像 Oracle技术网—FORM中,WINDOW标题的设置 Oracle技术网—FORM中,常用快捷键有哪些 Oracle技术网—FORM中,触发子exit_form的两种功能是什么 Oracle技术网—FORM中,当光标走到块的最后一项时,如何让按“enter回车”键时,光标自动走到下一条记录的第一项? Oracle技术网—FORM中,当用鼠标点击标签画布的某一“标签页”时,如何判断点击的是哪一页 Oracle技术网—FORM中,如何屏蔽默认的功能键 Oracle技术网—FORM中,如何实现屏幕同步刷新? Oracle技术网—FORM中,如何使用警告 Oracle技术网—FORM中,如何通过 ODBC 访问 Acress 数据? Oracle技术网—FORM中 Oracle技术网—FORM中,设置应用特性(光标类型) Oracle技术网—FORM中,怎样创建动态下拉列表List Oracle技术网—FORM中如何存取声音 Oracle技术网—FORM中如何存取图象?如何把图象从一个表中导到另一个表中? Oracle技术网—MIS中的图像应用技术 Oracle技术网—MIS中的图像应用技术 Oracle技术网—从FORM中调用REPORT时,如何使打印结果直接输出到打印机上 Oracle技术网—如何从FORM中调用REPORT程序 Oracle技术网—如何改变FORM(FMX模块)运行时的title? Oracle技术网—如何在FORM运行中,使定制菜单中的“窗口(W)”菜单项不显示 Oracle技术网—如何在启动FORM程序时直接登录到Oracle数据库上? Oracle技术网—运行FORM时,如何使按钮变灰(即无效) Oracle技术网—运行FORM时,如何使窗口(runtime窗口、画布窗口)自动变成最大化、最小化? Oracle技术网—在Developer/2000中如何读写文本型操作系统文件 Oracle技术网—在Oracle中实现报表的定长输出 linux vs Unix How To Install Oracle 8.0.5 onto RedHat Linux 6 HOWTO: OAS for Linux on FreeBSD HOWTO: Oracle for Linux on FreeBSD Oracle 7.3.4 Enterprise Edition for SCO UNIX 安装步骤 Oracle技术网—Oracle .com 套件在TurboLinux上的安装 Oracle技术网—ORACLE 7.3 Enterprise在SCO OPEN SERVER 5.02 及 5.04 的安装过程 Oracle技术网—ORACLE 7.3.4.2 for SCO Unix 安装说明 Oracle技术网—Oracle 8 for solaris 2.6 安装步骤 Oracle技术网—Oracle 8(8.0.5)标准版安装指南 Oracle技术网—Oracle 8i(8.1.5)企业版安装指南 Oracle技术网—ORACLE FOR SUN SOLARIS 安装手册 Oracle技术网—ORACLE FOR SUN SOLARIS 维护手册 Oracle技术网—ORACLE V.7.3.4.3 FOR AIX 安装说明 Oracle技术网—ORACLE8I FOR SUN SOLARIS2.7 安装说明 Oracle技术网—RedHat 6.1 Step-by-step Install notes for Oracle 8i Oracle技术网—RedHat Linux 6.0 上 Oracle 8(8.0.5)标准版 安装实例 Oracle技术网—RedHat Linux 6.0 上 Oracle 8i R2 (8.1.6) 企业版安装实例 Oracle技术网—如何集成Linux/Apache/PHP4/FastCGI/Oracle/MySQL环境 Oracle技术网—如何在你的Linux机器上安装运行Oracle Oracle技术网—为Linux配备Oracle 8 Oracle技术网—在RedHat 6.0上安装Oracle 8i(全攻略)
文字

Oracle基于Client/Server的性能调整

 

摘要:通过探讨和研究Oracle服务器和Client/Server的特点和原理,阐述了提高、调整Oracle应用系统性能的一些原则和方法。
关键词:Oracle;客户/服务器;系统全程区;网络I/O;回滚段

Oracle Performance Tunign Based on Client/Server

Zhang Dong Wang Hong Yao Yaowen
(1.Dep.of Computer Sciences and Engineering.South China University of Technology,Guangzhou 510641;2.Dept.of Informatics,Guangzhou School of Finauce,Guangzhou 510521)

AbstractIn this paper discuses and studies the characteristic of Oracle service and theory about Oracle service based on Client/Server.It also gives the way to improve and ture the performance of Oracle based on Client/Server
Key wordsOracle;Cclient/Server;SGA;Network I/O;Rollback Segment

  Oracle 数据库广泛应用在社会的各个领域,特别是在Client/Server模式的应用,但是应用开发者往往碰到整个系统的性能随着数据量的增大显著下降的问题,为了解决这个问题,从以下几个方面:数据库服务器、网络I/O、应用程序等对整个系统加以调整,充分发挥Oracle的效能,提高整个系统的性能。

调整数据库服务器的性能
  
Oracle数据库服务器是整个系统的核心,它的性能高低直接影响整个系统的性能,为了调整Oracle数据库服务器的性能,主要从以下几个方面考虑:
1.1 
调整操作系统以适合Oracle数据库服务器运行
  
Oracle数据库服务器很大程度上依赖于运行服务器的操作系统,如果操作系统不能提供最好性能,那么无论如何调整,Oracle数据库服务器也无法发挥其应有的性能。
1.1.1 
为Oracle数据库服务器规划系统资源
  据已有计算机可用资源, 
规划分配给Oracle服务器资源原则是:尽可能使Oracle服务器使用资源最大化,特别在Client/Server中尽量让服务器上所有资源都来运行Oracle服务。
1.1.2  
调整计算机系统中的内存配置
  多数操作系统都用虚存来模拟计算机上更大的内存,它实际上是硬盘上的一定的磁盘空间。当实际的内存空间不能满足应用软件的要求时,操作系统就将用这部分的磁盘空间对内存中的信息进行页面替换,这将引起大量的磁盘I/O操作,使整个服务器的性能下降。为了避免过多地使用虚存,应加大计算机的内存。
1.1.3 
为Oracle数据库服务器设置操作系统进程优先级
  不要在操作系统中调整Oracle进程的优先级,因为在Oracle数据库系统中,所有的后台和前台数据库服务器进程执行的是同等重要的工作,需要同等的优先级。所以在安装时,让所有的数据库服务器进程都使用缺省的优先级运行。
1.2 
调整内存分配
  
Oracle数据库服务器保留3个基本的内存高速缓存,分别对应3种不同类型的数据:库高速缓存,字典高速缓存和缓冲区高速缓存。库高速缓存和字典高速缓存一起构成共享池,共享池再加上缓冲区高速缓存便构成了系统全程区(SGA)。SGA是对数据库数据进行快速访问的一个系统全程区,若SGA本身需要频繁地进行释放、分配,则不能达到快速访问数据的目的,因此应把SGA放在主存中,不要放在虚拟内存中。内存的调整主要是指调整组成SGA的内存结构的大小来提高系统性能,由于Oracle数据库服务器的内存结构需求与应用密切相关,所以内存结构的调整应在磁盘I/O调整之前进行。
1.2.1
库缓冲区的调整
  库缓冲区中包含私用和共享SQL和PL/SQL区,通过比较库缓冲区的命中率决定它的大小。要调整库缓冲区,必须首先了解该库缓冲区的活动情况,库缓冲区的活动统计信息保留在动态性能表v$librarycache数据字典中,可通过查询该表来了解其活动情况,以决定如何调整。
  
Select sum(pins),sum(reloads) from v$librarycache;
  Pins列给出SQL语句,PL/SQL块及被访问对象定义的总次数;Reloads列给出SQL
和PL/SQL块的隐式分析或对象定义重装载时在库程序缓冲区中发生的错误。如果sum(pins)/sum(reloads) ≈0,则库缓冲区的命中率合适;若sum(pins)/sum(reloads)>1, 则需调整初始化参数 shared_pool_size来重新调整分配给共享池的内存量。
1.2.2
数据字典缓冲区的调整
  数据字典缓冲区包含了有关数据库的结构、用户、实体信息。数据字典的命中率,对系统性能影响极大。数据字典缓冲区的使用情况记录在动态性能表v$librarycache中,可通过查询该表来了解其活动情况,以决定如何调整。
  
Select sum(gets),sum(getmisses) from v$rowcache;
  Gets列是对相应项请求次数的统计;Getmisses
列是引起缓冲区出错的数据的请求次数。对于频繁访问的数据字典缓冲区,sum(getmisses)/sum(gets)<10%~15%。若大于此百分数,则应考虑增加数据字典缓冲区的容量,即需调整初始化参数shared_pool_size来重新调整分配给共享池的内存量。
1.2.3
缓冲区高速缓存的调整
  用户进程所存取的所有数据都是经过缓冲区高速缓存来存取,所以该部分的命中率,对性能至关重要。缓冲区高速缓存的使用情况记录在动态性能表v$sysstat中,可通过查询该表来了解其活动情况,以决定如何调整。
  
Select name,value from v$sysstat where name in ('dbblock gets','consistent gets','physical reads');
  dbblock gets和consistent gets的值是请求数据缓冲区中读的总次数。physical reads的值是请求数据时引起从盘中读文件的次数。从缓冲区高速缓存中读的可能性的高低称为缓冲区的命中率,计算公式:
  Hit Ratio=1-(physical reds/(dbblock gets+consistent gets))
  如果Hit Ratio<60%~70%,则应增大db_block_buffers的参数值。db_block_buffers可以调整分配给缓冲区高速缓存的内存量,即db_block_buffers可设置分配缓冲区高速缓存的数据块的个数。缓冲区高速缓存的总字节数=db_block_buffers的值*db_block_size的值。
db_block_size 的值表示数据块大小的字节数,可查询 v$parameter 表:
  select name,value from v$parameter where name='db_block_size';
  在修改了上述数据库的初始化参数以后,必须先关闭数据库,在重新启动数据库后才能使新的设置起作用。
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

调整 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种方法时:首先考虑使用完整约束性。对于数据库触发器和存储过程,如果需要所有访问数据库的程序自动实施一定规则或检查,那么使用数据库触发器;如果只需对少数的程序实施一定的规则或检查,则可创建一个过程,让有关程序调用这个过程。

应用程序的调整
3.1
SQL语句的优化
  SQL语句的执行速度,可以受很多因素的影响而变化。但主要的影响因素是:驱动表、执行操作的先后顺序和索引的运用。可以由很多不同的方法间接地改变这些因素,以达到最优的执行速度。这里主要探讨当对多个表进行连接查询时应遵循的优化原则:
  (1) 
用于连接的子句的列应被索引、在Where子句中应尽量利用索引,而不是避开索引。
  (2) 
连接操作应从返回较少行上驱动。
  (3) 
如果所连接的表A和B,A表长度远远大于B表,建议从较大的A表上驱动。
  (4) 
如果Where子句中含有选择性条件,Where No=20,将最具有选择性部分放在表达式最后。
  (5)  如果只有一个表有索引,另一表无索引,无索引的表通常作为驱动表。如A表的No列以被索引,而B表的No 列没被索引,则应当B表作为驱动表,A表作为被驱动表。
  (6) 
若用于连接的列和Where子句中其他选择条件列均有索引,则按各个索引对查询的有效性和选择性分别定出级别,结合表中具体数据构成情况,从中选出优化路径,一般需要考虑:子句中哪些列可以使用索引、哪些索引具有唯一性及被查询表行数目等。
3.2 
建立和使用视图、索引
  
利用视图可以将基表中的列或行进行裁减、隐藏一部分数据,并且能够将涉及到多个表的复杂查询以视图的方式给出,使应用程序开发简洁快速。利用索引可以提高查询性能,减少磁盘
I/O,优化对数据表的查询,加速SQL语句的执行。但任何时候建立索引都能提高性能,何时建立索引应当遵循以下原则:该表常用来在索引列上查询,该表不常更新、插入、删除等操作,查询出来的结果记录数应控制在原表的2%~4%
3.3 
使用 Oracle 的数组接口
  
当一个客户应用程序插入一行或用一个查询来向服务器请求某行时,不是发送具有单个行的网络包,而是采用数组处理,即把要插入的多个行或检索出的多个行缓冲在数组中,然后通过很少的几个包就可在网上传送这些数组。例如,一个给定的Select语句返回2000行数据,每行平均大小为40个字节,数据包的大小为4kB,而数组大小参数(arraysize)设置为20
,则需从服务器发送100个数据包到客户机。如果简单地把(arraysize)设置为2000,那么同样的操作只需要传送 20个数据包。这样就减少了网络的传输量,提高了所有应用的性能。

总结
  我们在开发应用程序时,遵循上述的方法和原则,对系统进行调整,收到了令人满意的效果。但是应当指出,由于客户机、网络、服务器这3个相互依存的组成部分都必须调整和同步才能产生最佳的性能,因此还应根据系统的具体情况,具体分析和调整。

上一篇: 下一篇: