Oracle是目前应用最广泛的数据库系统一个完整的数据库系统包括系统硬件操作系统网络层DBMS(数据库管理系统)应用程序与数据各部分之间是互相依赖的对每个部分都必须进行合理的配置设计和优化才能实现高性能的数据库系统本文讨论笔者使用Oracle开发局域网中小型数据库应用中系统硬件的选择与使用应用数据库系统设计与开发方面的一些心得和建议应用数据库系统包含应用数据库和应用两方面的内容应用数据库就是生产数据库与系统数据库相对
系统硬件的选择与使用
与数据库系统密切相关的硬件主要有CPU内存集群存储设备等这里不对集群进行讨论
CPU
CPU的数目和速度直接影响数据库操作的速度Oracle数据库提供并行查询选项允许SQL操作以协同方式在多个CPU上执行可以很大程度的发挥多CPU的性能为系统添加CPU前首先要对应用程序的SQL代码做优化提高应用程序的效率质量低劣的应用可能会引起CPU资源的无谓的消耗其次要了解操作系统对CPU数目的限制及系统的可扩展性在系统CPU资源已定的情况下要对各类应用进行分析在保证关键应用正常运行的前提下尽可能将大量占用CPU资源的应用放在系统相对空闲的时候进行良好的工作调度可以有效减少对CPU的竞争使用加快系统的响应时间
内存
数据库系统中应保证有足够大的内存在UNIX系统中如果系统的物理内存小于GB可将交换区的大小设为内存的倍否则可设为内存的倍交换区要放在磁盘速度最快的硬盘上Oracle 的SGA区大小直接关系到数据库操作的性能一般来说SGA区的大小可设为系统可用内存的%到%SGA区过多占用系统内存反而会降低性能在应用系统运行中应定期监测系统的内存使用情况对关键应用进行分析根据应用适时调整SGA区各部分的大小Oraclei可在不重新启动数据库的情况下修改SGA区的参数实时改变SGA区的大小
存储设备
在网络时代信息资源的积累和广泛应用对数据存储技术的发展提出了更大的挑战数据存储模式从传统的总线连接模式进入了网络存储模式但存储设备依然是硬盘磁带(带库)磁盘阵列在中小型数据库应用中传统存储模式仍占主导地位
磁盘I/O是数据库操作的瓶颈之一磁盘的合理选择和使用在数据库系统中显得尤为重要在最初做数据库系统规划时应充分考虑到系统的容量和预期的增长尽可能为以后的扩展留足空间在硬盘和磁盘阵列的选择与使用中应注意以下几点
·选择支持热插拔功能的硬盘这样在出现硬盘Oracle 平台应用数据库系统的设计与开发失败时可以在系统正常运行的情况下更换硬盘
·不要选择太大的硬盘切记对Oracle 应用程序~GB大小的硬盘是比较合适的最好购买大量的中小型硬盘这样在配置RAID时可提供更大的灵活性
·如果选用了磁盘阵列对于Oracle数据库应用如果经费能够支持RAID +是最佳的配置方法在RAID 中读操作性能得到了一定的改善但写性能损失很大如果某个硬盘失败硬盘重建的工作量非常大RAID 适用于DSS(决策支持系统)应用对OLTP(联机事物处理)应用不太合适
·在实现RAID时要正确地选择分条的大小决定分条大小的三个主要因素是应用程序的特性(DSSOLTP批处理)操作系统与数据库的数据块大小磁盘阵列中的硬盘数目数据库的数据块大小应是操作系统数据块大小的整数倍同样分条大小也必须是操作系统数据块大小的整数倍如果使用裸设备分条大小应是操作系统物理数据块的大小分条可按照水平方向进行也可按照垂直方向进行水平分条跨越每个硬盘控制器进行垂直分条跨越整个硬盘集合进行分条集合中的成员数应不大于硬盘控制器数OLTP应用程序数据访问的数据量不大一般可选择KB 或KB 的分条大小而DSS应用程序访问的数据量大可考虑使用KBKB或KB的分条大小
应用数据库的设计与开发
Oracle数据库软件安装和配置完成后就进入了应用数据库的设计阶段应用数据库设计包括逻辑设计与物理设计合理的逻辑设计会大大提高数据库的性能增强数据库的可维护性在设计中根据应用抽象出实体关系模型将实体关系图映射为标准化(数据完整与应用无关存储优化)的关系模型(数据库对象)当前有一些辅助工具(Oracle Designer等)来实现实体关系图到SQL代码的映射数据库的物理设计就是数据库对象的存储设计即如何为数据库对象分配存储空间
在进行数据库对象的设计前数据库的管理和开发人员对应用和应用的数据及其应用关系要有一个详尽的理解根据应用进行数据库对象的规划和设计大概包含以下几个方面
·确定需建立的数据库用户明确用户的系统权限和表空间限额为用户设计资源限制profile
·确定应用数据应分多少个表进行设计各表分别属于的用户各用户对各个表的操作权限
·明确各表的结构确定表的主键及约束
·明确哪些表是应用运行的关键表哪些是事务表
·分析哪些表是主表哪些表是从表确定表和表之间的外键约束选择合适的表作为表连接的驱动表
·根据应用确定在哪些表上对哪些列建立合适的索引
·根据表和索引的设计确定要创建的表空间和回滚段为表空间和回滚段选择合适的磁盘尽可能创建本地管理的表空间减少数据库空间管理方面的工作
·明确需要编写的触发器及过程
·为数据库对象选择备份和恢复策略
在数据库设计阶段有时未必能完全确定合适的数据库对象的特征应用设计和开发中还可能发现不合适的地方需要回过头来进行调整和修改但设计阶段的工作越细致出现问题的可能性就越小工作的效率就越高
创建数据库对象时要根据数据库对象的特点结合存储设备的大小数量及速度等对数据库对象分类进行存储最大限度地消除或减少资源竞争在数据库对象创建时主要应遵循以下原则
·应用数据应放在单独的表空间不要将应用数据放在系统表空间为防止无意的使用系统表空间将应用用户的系统表空间限额设为
·索引和表应放在位于不同硬盘上的不同的表空间这样会提高数据库操作的速度
·需要同时被访问的表要分开存放利于并发访问的实施
·如果磁盘数量有限可把不常联合访问的表放在相同的磁盘上
·预分配的原则创建数据库对象(表空间回滚段表索引等)时根据对象的情况设置合适的storage参数非常重要创建对象设计时对对象的容量和预期的增长有一个估计这样才能确定存储参数的大小一般来说应预先给表和索引等数据库对象分配足够的空间数据库段不要太多地做动态扩展因为会影响数据库性能一个段(segment)由一个区(extent)构成是最理想的initial 参数可以稍大一点如果可能可设为最大容量的大小initial必须是db_block_size的整数倍next参数的设置比较灵活根据应用进行相应的设置但也必须是db_block_size的整数倍为了减少数据库碎片的产生pctincrease参数应该尽量设为更新操作比较少的段pctfree要设置得小一点更新操作很多的段要设置得大一些inittrans和freelists的值要相等大小与并发事务数相关
·分而治之的原则大的数据库表和索引可考虑进行分区存放不同的分区可位于不同的磁盘上更好地均衡I/OOracle可以只对表的某些分区进行查询这样会提高查询的速度可对分区进行数据的删除装载还可以移动分区对表的管理和控制具有更大的灵活性可以有更多的策略选择更好地执行备份和恢复操作注意对某些分区进行操作后在Oraclei下必须重建全局索引
·大小和增长趋势类似的表最好放在相同的表空间可以有效控制硬盘碎片的产生提高空闲块的可重用性
·相同备份和恢复策略的表最好放在同一个表空间这样有助于备份和恢复工作的完成
·对响应时间要求苛刻的应用所访问的对象放在速度快的磁盘上
数据库应用系统的设计与开发
应用设计
不论使用何种工具或语言来开发应用程序都需要进行应用的全面设计应用设计包括
首先分析应用要完成的功能确定应用类型是OLTP(联机事务处理)系统DSS(决策支持)系统还是批处理系统
其次了解应用在何时由谁使用应用访问的数据应用程序用到的组件应用被要求的响应时间等在设计前必须对这些问题尽量进行解答这对应用设计特别是大规模的应用设计非常重要
第三根据上面的资料确定应用的体系结构是采用client/server两层架构的方式还是采用browser/server多层架构的方式实现一个开放的分布式应用系统如何对应用服务器进行选择与配置
第四将应用按功能划分为一个或多个应用程序明确应用程序的具体功能类型组成使用时间及高峰时间事务的流量用户组成访问的数据库对象等确定应用程序间的关联和互操作特性对各个应用程序的执行时间合理地进行安排
第五对应用程序进行模块化设计选择实现应用的数据库组件和开发语言及工具
应用开发
在应用开发阶段根据应用的不同实现的方法和步骤会有很大的差异这里只讨论以下在应用开发中需要重点注意的几个问题
) 在开发会话关键型应用程序时尽可能使用Pro*C/C++或OCI在编写后备实例和数据库失败恢复等需要进行数据库重新连接的代码时用Pro*C/C++ 或OCI比用PL/SQL要容易实现在Oracle/i中OCI可以实现透明应用程序失败恢复(TAF)编写数据库操作繁重的应用程序使用OCIOCI程序对数据库的访问是通过调用OCI库函数实现的能够直接到达系统内核比Pro*C/C++速度更快
) 在开发会话关键型应用程序时尽量实现失败检查和恢复能力如指定后备数据库或实例终止出错客户进程等
) 编写代码时要考虑应用程序的可维护性尽量将应用程序独立于数据库的变化可使用视图相对变量类型定义(%TYPE)记录型变量定义(%ROWTYPE)采用表驱动的应用程序设计模式
) 进行充分的单元测试和模块测试为应用集成打下坚实的基础
) 对关键表操作的应用程序实现要特别当心必要的话在应用中对关键表先做备份应用成功执行后再删除备份表
) 编码结束后应对代码进行优化前面提到过代码优化在数据库应用中非常重要很高比例的性能问题与编码拙劣的应用程序有关
) 定期对应用操作的数据库对象增长的情况进行监控避免因空间不足引起的应用程序的失败
) 对应用的数据定时进行整理有些应用中存放在数据库表中的数据只要求保存一段时间就需要定时对数据进行删除如果手工进行删除操作工作量很大可以用Oracle提供的作业来完成 unix系统下可用cron进程来实现笔者在工作中经常使用cron来做数据的定时删除根据应用要求编制Pro*C/C++程序编写Shell脚本调用应用程序将Shell脚本提交给cron进程
注意在Shell脚本中必须设置相应的Oracle环境变量如ORACLE_BASEORACLE_HOMENLS_LANGLD_LIBRARY_PATHPATH等用户环境文件中的定义是无效的
)对于大量删除操作的应用程序如果表是分区存放的可对数据分区执行截断(truncate)操作截断操作执行速度快并且不会产生碎片但截断后可能需要进行重建索引的工作对大量的数据做删除(delete)操作会引起数据库回滚段的急剧增长建议根据删除数据量为这类应用创建特殊的专用回滚段为专用回滚段指定合适的storage参数平常专用回滚段可以是离线的(offline)在事物开始前使专用回滚段在线(online)指定事物使用专用回滚段事物结束后再使专用回滚段离线笔者使用的部分代码 (Pro*C/C++) 如下所示
EXEC SQL WHENEVER SQLERROR goto Error;
EXEC SQL CONNECT :uid;
EXEC SQL ALTER ROLLBACK SEGMENT RBS_SPEC ONLINE;
EXEC SQL SET TRANSACTION USE ROLLBACK SEGMENT RBS_SPEC;
EXEC SQL DELETE FROM WHERE
EXEC SQL ALTER ROLLBACK SEGMENT RBS_SPEC OFFLINE;
结束语
Oracle数据库是一个功能强大的数据库系统适用于各种各样的应用系统系统规模可大可小应用设计或简单或复杂因此在使用过程中要根据各自不同的应用进行设置与调整以上是笔者在使用Oracle进行应用开发过程中一点心得和体会写出来与大家共勉谢谢