预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共71页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Oracle的性能优化本章学习目标 本章将介绍优化和调整Oracle数据库系统的一些相关命令和方法。本章内容安排9.1数据库性能优化概述(1)调整数据结构的设计。 (2)调整应用程序结构设计。 (3)调整数据库SQL语句。 (4)调整服务器内存分配。 (5)调整硬盘I/O,这一步是在信息系统开发之前完成的。 (6)调整操作系统参数。1.在线事务处理信息系统(OLTP) 这种类型的信息系统一般需要有大量的Insert、Update操作。OLTP系统需要保证数据库的并发性、可靠性和最终用户的速度,这类系统使用的Oracle数据库需要主要考虑下述因素或参数: (1)数据库回滚段是否足够? (2)是否需要建立Oracle数据库索引、聚集、散列? (3)系统全局区(SGA)大小是否足够? (4)SQL语句是否高效?2.数据仓库系统(DataWarehousing) 这种信息系统的主要任务是从Oracle的海量数据中进行查询,得到数据之间的某些规律。数据库管理员需要为这种类型的Oracle数据库着重考虑下述因素或参数: (1)是否采用B*-索引或者bitmap索引? (2)是否采用并行SQL查询以提高查询效率? (3)是否采用PL/SQL函数编写存储过程? (4)是否有必要建立并行数据库,来提高数据库的查询效率。9.2.2SQL语句优化的具体方法4.SQL子查询的调整 (1)关联子查询和非关联子查询 非关联查询的开销——非关联查询时子查询只会执行一次,而且结果是排序好的,并保存在一个Oracle的临时段中,其中的每一个记录在返回时都会被父查询所引用。在子查询返回大量的记录的情况下,将这些结果集排序,以及将临时数据段进行排序会增加大量的系统开销。 关联查询的开销——对返回到父查询的记录来说,子查询会每行执行一次。因此,必须保证任何可能的时候子查询用到索引。(2)在子查询中慎重使用IN或者NOTIN语句 在子查询中慎重使用IN或者NOTIN语句,使用where(NOT)exists的效果要好的多。 ①带IN的关联子查询是多余的,因为IN子句和子查询中相关的操作的功能是一样的。 ②为非关联子查询指定EXISTS子句是不适当的,因为这样会产生笛卡尔乘积。 ③尽量不要使用NOTIN子句。(3)慎重使用视图的联合查询 慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些。 可以在参数文件中设置SHARED_POOL_RESERVED_SIZE参数,这个参数在SGA共享池中保留一个连续的内存空间,连续的内存空间有益于存放大的SQL程序包。9.3.2物理I/O的调整内存参数的调整主要是指Oracle数据库的系统全局区(SGA)的调整。SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。 1.共享池 共享池由两部分构成:共享SQL区和数据字典缓冲区。共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。(1)数据库管理员通过执行下述语句,来查看共享SQL区的使用率。 select(sum(pins-reloads))/sum(pins)"LibCache"fromv$librarycache; 共享SQL区的使用率应该在90%以上,否则需要增加共享池的大小。 (2)数据库管理员可以执行下述语句,查看数据字典缓冲区的使用率。 select(sum(-getmisses-usage-fixed))/sum(gets)"RowCache"fromv$rowcache; 数据字典缓冲区的使用率也应该在90%以上,否则需要增加共享池的大小。2.数据缓冲区 数据库管理员可以通过下述语句,来查看数据库数据缓冲区的使用情况。 SELECTname,FROMv$sysstatWHEREnameIN('dbblockgets','consistentgets','physicalreads'); 根据查询出来的结果可以计算出数据缓冲区的使用命中率: 数据缓冲区的使用命中率=1–(physicalreads/(dbblockgets+consistentgets)) 这个命中率应该在90%以上,否则需要增加数据缓冲区的大小。3.日志缓冲区 数据库管理员可以通过执行下述语句,查看日志缓冲区的使用情况。 selectname,valuefromv$sysstatwherenamein('redoentries','redologspacerequests'); 根据查询出的结果可以计算出日志缓冲区的申请失败率: 申请失败率=requests/entries 申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加Oracle数据库的日志缓冲区。(1)在磁盘上建立数据文件前首先运行磁盘