1 / 71

Oracle的性能优化

Oracle的性能优化. 第九章 Oracle 的性能优化. 本章学习目标 本章将介绍优化和调整 Oracle 数据库系统的一些相关命令和方法。. 本章内容安排. 9.1 数据库性能优化概述. 9.2 SQL 语句的优化. 9.3 Oracle运行环境的优化. 9.4 并发事件处理. 9.5 数据完整性. 9.7 常见问题处理. 9.1 数据库性能优化概述. 9.1.1 数据库性能优化的内容. 9.1.2 不同类型系统的优化. 9.1.1 数据库性能优化的内容.

jesus
Download Presentation

Oracle的性能优化

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Oracle的性能优化

  2. 第九章 Oracle的性能优化 本章学习目标 本章将介绍优化和调整Oracle数据库系统的一些相关命令和方法。

  3. 本章内容安排 9.1 数据库性能优化概述 9.2 SQL语句的优化 9.3 Oracle运行环境的优化 9.4 并发事件处理 9.5 数据完整性 9.7 常见问题处理

  4. 9.1 数据库性能优化概述 9.1.1 数据库性能优化的内容 9.1.2 不同类型系统的优化

  5. 9.1.1 数据库性能优化的内容 (1)调整数据结构的设计。 (2)调整应用程序结构设计。 (3)调整数据库SQL语句。 (4)调整服务器内存分配。 (5)调整硬盘I/O,这一步是在信息系统开发之前完成的。 (6)调整操作系统参数。

  6. 9.1.2 不同类型系统的优化 1.在线事务处理信息系统(OLTP) 这种类型的信息系统一般需要有大量的Insert、Update操作。OLTP系统需要保证数据库的并发性、可靠性和最终用户的速度,这类系统使用的Oracle数据库需要主要考虑下述因素或参数: (1)数据库回滚段是否足够? (2)是否需要建立Oracle数据库索引、聚集、散列? (3)系统全局区(SGA)大小是否足够? (4)SQL语句是否高效?

  7. 2.数据仓库系统(Data Warehousing) 这种信息系统的主要任务是从Oracle的海量数据中进行查询,得到数据之间的某些规律。数据库管理员需要为这种类型的Oracle数据库着重考虑下述因素或参数: (1)是否采用B*-索引或者bitmap索引? (2)是否采用并行SQL查询以提高查询效率? (3)是否采用PL/SQL函数编写存储过程? (4)是否有必要建立并行数据库,来提高数据库的查询效率。

  8. 9.2 SQL语句的优化 9.2.1 SQL语句的优化规则 9.2.2 SQL语句优化的具体方法

  9. 9.2.1 SQL语句的优化规则 (1)去掉不必要的大表、全表扫描。不必要的大表、全表扫描会造成不必要的输入输出,而且还会拖垮整个数据库; (2)检查优化索引的使用 这对于提高查询速度来说非常重要; (3)检查子查询,考虑SQL子查询是否可以用简单连接的方式进行重新书写; (4)调整PCTFREE和PCTUSED等存储参数优化插入、更新或者删除等操作; (5)考虑数据库的优化器; (6)考虑数据表的全表扫描和在多个CPU的情况下考虑并行查询。

  10. 9.2.2 SQL语句优化的具体方法 1.索引的使用 2.SQL语句排序优化 3. 选择联合查询的联合次序 4.SQL子查询的调整

  11. 1、索引的使用 (1)尽量使用索引 是全表扫描还是索引范围扫描主要考虑SQL的查询速度问题。试比较下面两条SQL语句: ①语句A: SELECT dname,deptno FROM dept WHERE deptno NOT IN(SELECT deptno FROM emp); ②语句B: SELECT dname,deptno FROM dept WHERE NOT EXISTS(SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);

  12. (2)索引不起作用的情况 ①存在数据类型隐形转换 ②列上有数学运算 ③使用不等于(<>)运算 ④使用substr字符串函数 ⑤‘%’通配符在第一个字符 ⑥字符串连接(||)

  13. (3)函数的索引 例如,日期类型是经常用到的,而且在SQL语句中会使用to_char函数以查询具体的的范围日期。如: select * from staff_member where TO_CHAR(birth_day,’YYYY’)=’2003’; 可以建立基于函数的索引如: CREATE INDEX Ind_emp_birth ON staff_member (to_char((birth_day,’YYYY’));

  14. 2.SQL语句排序优化 • 排序发生的情况如下: • SQL中包含group by 子句 • SQL 中包含order by 子句 • SQL 中包含 distinct 子句 • SQL 中包含 minus 或 union操作

  15. 3.选择联合查询的联合次序 联合查询中如涉及到多个表的字段关联及查询,其SQL查询语句联合次序的不同写法,会导致语句对各表具体操作的步骤有不同的次序,所以虽然执行结果相同,但执行效率却不同。

  16. 4.SQL子查询的调整 (1)关联子查询和非关联子查询 非关联查询的开销——非关联查询时子查询只会执行一次,而且结果是排序好的,并保存在一个Oracle的临时段中,其中的每一个记录在返回时都会被父查询所引用。在子查询返回大量的记录的情况下,将这些结果集排序,以及将临时数据段进行排序会增加大量的系统开销。 关联查询的开销——对返回到父查询的记录来说,子查询会每行执行一次。因此,必须保证任何可能的时候子查询用到索引。

  17. (2)在子查询中慎重使用IN或者NOT IN语句 在子查询中慎重使用IN或者NOT IN语句,使用where (NOT)exists的效果要好的多。 ①带IN的关联子查询是多余的,因为IN子句和子查询中相关的操作的功能是一样的。 ②为非关联子查询指定EXISTS子句是不适当的,因为这样会产生笛卡尔乘积。 ③尽量不要使用NOT IN子句。

  18. (3)慎重使用视图的联合查询 慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些。 可以在参数文件中设置SHARED_POOL_RESERVED_SIZE参数,这个参数在SGA共享池中保留一个连续的内存空间,连续的内存空间有益于存放大的SQL程序包。

  19. 9.3 Oracle运行环境的优化 9.3.1 内存结构的调整 9.3.2 物理I/O的调整 9.3.3 CPU的优化调整 9.3.4 网络配置的优化 9.3.5 Oracle碎片整理 9.3.6 Oracle系统参数的调整

  20. 9.3.1 内存结构的调整 内存参数的调整主要是指Oracle数据库的系统全局区(SGA)的调整。SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。 1.共享池 共享池由两部分构成:共享SQL区和数据字典缓冲区。共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。

  21. (1)数据库管理员通过执行下述语句,来查看共享SQL区的使用率。(1)数据库管理员通过执行下述语句,来查看共享SQL区的使用率。 select (sum(pins-reloads))/sum(pins) "Lib Cache" from v$librarycache; 共享SQL区的使用率应该在90%以上,否则需要增加共享池的大小。 (2)数据库管理员可以执行下述语句,查看数据字典缓冲区的使用率。 select (sum(-getmisses-usage-fixed))/sum(gets) "Row Cache" from v$rowcache; 数据字典缓冲区的使用率也应该在90%以上,否则需要增加共享池的大小。

  22. 2.数据缓冲区 数据库管理员可以通过下述语句,来查看数据库数据缓冲区的使用情况。 SELECT name, FROM v$sysstat WHERE name IN ('db block gets','consistent gets','physical reads'); 根据查询出来的结果可以计算出数据缓冲区的使用命中率: 数据缓冲区的使用命中率=1 –( physical reads/(db block gets + consistent gets)) 这个命中率应该在90%以上,否则需要增加数据缓冲区的大小。

  23. 3.日志缓冲区 数据库管理员可以通过执行下述语句,查看日志缓冲区的使用情况。 select name,value from v$sysstat where name in ('redo entries','redo log space requests'); 根据查询出的结果可以计算出日志缓冲区的申请失败率: 申请失败率=requests/entries 申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加Oracle数据库的日志缓冲区。

  24. 9.3.2 物理I/O的调整 (1)在磁盘上建立数据文件前首先运行磁盘碎片整理程序 为了安全地整理磁盘碎片,需关闭打开数据文件的实例,并且停止服务。如果有足够的连续磁盘空间建立数据文件,那么就很容易避免数据文件产生碎片。 (2)不要使用磁盘压缩 Oracle数据文件不支持磁盘压缩。 (3)不要使用磁盘加密 加密象磁盘压缩一样增加了一个处理层,降低磁盘读写速度。如果担心自己的数据可能泄密,可以使用dbms_obfuscation包和label security选择性地加密数据的敏感部分。

  25. (5)使用RAID RAID的使用应注意: ①选择硬件RAID超过软件RAID; ②日志文件不要放在RAID 5卷上,因为RAID 5读性能高而写性能差; ③把日志文件和归档日志放在与控制文件和数据文件分离的磁盘控制系统上。 (6)分离页面交换文件到多个磁盘物理卷 跨越至少两个磁盘建立两个页面文件。可以建立四个页面文件并在性能上受益,确保所有页面文件的大小之和至少是物理内存的两倍。

  26. 9.3.3 CPU的优化调整 1.查看CPU的使用情况 使用操作命令可以看到CPU的使用情况,一般UNIX操作系统的服务器,可以使用sar –u命令查看CPU的使用率;NT操作系统的服务器,可以使用NT的性能管理器来查看CPU的使用率。 出现CPU资源不足的情况是很多的:SQL语句的重解析、低效率的SQL语句、锁冲突都会引起CPU资源不足。

  27. 2.查看SQL语句的解析情况 (1)数据库管理员可以执行下述语句来查看SQL语句的解析情况: SELECT * FROM V$SYSSTAT WHERE NAME IN ('parse_time_cpu','parse_time_elapsed','parse_count_ hard'); 这里: ①parse_time_cpu:是系统服务时间。 ②parse_time_elapsed:是响应时间。 而用户等待时间为: waite_time = parse_time_elapsed – parse_time_cpu 由此可以得到用户SQL语句平均解析等待时间: 用户SQL语句平均解析等待时间=waite_time/parse_count

  28. (2)数据库管理员还可以通过下述语句,查看低效率的SQL语句:(2)数据库管理员还可以通过下述语句,查看低效率的SQL语句: SELECT BUFFER_GETS,EXECUTIONS,SQL_TEXT FROM V$SQLAREA; 优化这些低效率的SQL语句也有助于提高CPU的利用率。

  29. 3.查看Oracle数据库的冲突情况 数据库管理员可以通过v$system_event数据字典中的“latch free”统计项查看Oracle数据库的冲突情况,如果没有冲突的话,latch free查询出来没有结果。如果冲突太大的话,数据库管理员可以降低spin_count参数值,来消除高的CPU使用率。

  30. 4.CPU的优化调整方法 一些优化CPU使用和配置的具体方法有: (1)取消屏幕保护。 (2)把系统配置为应用服务器。 (3)监视系统中消耗中断的硬件。 (4)保持最小的安全审计记录。 (5)在专用服务器上运行Oracle。 (6)禁止非必须的服务。

  31. 9.3.4 网络配置的优化 网络配置是性能调整的一项很重要的内容,而且很容易隐藏性能瓶颈。 (1)配置网卡使用最快速度和有效模式 (2)删除不需要的网络协议 (3)优化网络协议绑定顺序 (4)为Oracle禁止或优化文件共享

  32. 9.3.5 Oracle碎片整理 1.碎片是如何产生的 2.碎片对系统的影响 (1)导致系统性能减弱 (2)浪费大量的表空间

  33. 3.自由范围的碎片计算 用fsfi——free space fragmentation index(自由空间碎片索引)值来直观体现: fsfi=100*sqrt(max(extent)/sum(extents))*1/sqrt(sqrt(count(extents)))

  34. 4.自由范围的碎片整理 可以将表空间的缺省存储参数pctincrease改为非0。一般将其设为1,如: alter tablespace temp default storage(pctincrease 1); 这样smon便会将自由范围自动合并,达到碎片整理的目的。 也可以采用如下语句,通过手工合并自由范围来达到碎片整理的目的。 alter tablespace temp coalesce;

  35. 5.段的碎片整理 段由范围组成,在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典DBA_segments,范围的信息可查看数据字典DBA_extents。如果段的碎片过多, 将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用import/export(输入/输出)工具来完成。 export()命令有一个(压缩)标志,这个标志在读表时会引发export确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数,等于全部所分配空间。若这个表关闭, 则使用import()工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如: exp user/password file=exp.dmp compress=y grants=y indexes=y tables=(table1,table2); 若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表: imp user/password file=exp.dmp commit=y buffer=64000 full=y; 这种方法可用于整个数据库。 另外,应该定期shutdown database,从而清理momery碎片。

  36. 9.3.6 Oracle系统参数的调整 1.Shared Pool and Library Cache Performance Tuning(共享池和Library Cache) 共享池调整的技巧主要有: (1)刷共享池 刷( Flush)共享池可以使小块的内存合并为大块的内存。当共享池的碎片过多时,能够暂时恢复性能。刷共享池可以使用语句: alter system flush shared_pool; (2)绑定变量

  37. 2.Buffer Cache Performance Tuning(数据库缓存调整) 从缓存调整的角度看,应力求避免以下的问题: (1)“缓存的最近最少使用(LRN)链”(cache buffers LRU chain)的加锁竞争; (2)“平均写队列”(Average Write Queue)长度过大; (3)过多时间花在等待“写完毕等待上”(write complete waits); (4)过多时间花在等待“缓冲释放等待”上(free buffer waits)。

  38. 3.Latch Contention(加锁或插销竞争) 插销加锁是SGA中保护共享数据结构的低层的串行化机制。插销latch是一类可以非常快的获得和释放的锁。插销锁的实现是依赖于操作系统的,尤其在关于一个进程是否会等待一个锁,和等多久方面。 有如下的锁(插销)需要调整: (1)Redo Copy/Allocation Latch:重写日志的复制/分配插销 (2)Shared Pool Latch:共享池的插销 (3)Library Cache Latch:Library Cache插销

  39. 4.Redo Log Buffer Performance Tuning(重写日志缓冲的调整) LGWR 将重写日志缓冲中的重写项写到重写日志文件中。一旦LGWR将这些项复制到重写日志文件中,用户进程就可以重写这些项。统计项目“redo log space requests”反映了用户进程等待重写日志缓冲中空间的时间的数字。 (1)设置重写日志大小的提示: “redo log space requests”的值应该接近0。 (2)设定合适的重写日志的大小,建议每15-30分钟进行一次重写日志的切换。

  40. 5.Query Performance Tuning(查询效率的调整) 如果查询运行得很慢,请考虑以下这些方面: (1)希望这个查询运行的有多快以及有理由这样要求吗? (2)优化模式OPTIMIZER_MODE 设为何值? (3)查询涉及的索引都是有效的吗? (4)在数据库中有没有其他的长时间运行的查询(大查询)。 (5)表和索引上有统计信息吗? (6)统计信息是被计算出来的还是被估计出来的? 对于查询的性能调整有两个主要的调试工具:TKPROF和AUTOTRACE。

  41. 6.Temporary Tablespace Performance Tuning(临时表空间的调整) 临时表空间的调整的技巧如下: 如果即使在稳定的状态下也存在很多的排序扩展锁(Sort Extent Pool latch)的竞争,应该通过修改临时表空间的DEFAULT STORAGE 子句的NEXT值来增大扩展块的大小。如果存在很多的排序扩展锁(Sort Extent Pool latch)的竞争并且这种等待是由于过多的并发的排序造成的,应该增大SORT_AREA_SIZE参数的大小,以使更多的排序能保存在内存中。 建议让扩展块的大小和SORT_AREA_SIZE参数相同。

  42. 9.4 并发事件处理 9.4.1 并发事件的产生 9.4.2 锁

  43. 9.4.1 并发事件的产生 数据库是一个共享资源,可为多个应用程序所共享。这些程序可串行运行,但在许多情况下,可能多个程序或一个程序的多个进程并行地运行,这就是数据库的并行操作。在多用户数据库环境中,多个用户程序可并行地存取数据库,如果不对并发操作进行控制,会存取不正确的数据,或破坏数据库数据的一致性。

  44. (1)当一个用户正在修改表中数据的同时,另一个用户正试图删除该表。(1)当一个用户正在修改表中数据的同时,另一个用户正试图删除该表。 (2)用户A正试图读取用户B的某个事务中的一些数据,在用户A的事务开始后,该事务由用户B修改和提交。用户A读取用户B提交的数据。这意味着在同一个事务中读取的数据在某个时刻不一致。 (3)某个用户对数据进行修改,另一个用户在第一个用户提交事务以前对同一行进行修改;因此,第一个用户所做的改变丢失了。 (4)一个用户从另一个用户尚未提交的数据中读取数据;也就是说,在用户B的改变提交以前,用户A读取用户B正在修改的行。

  45. 9.4.2 锁 1.锁的功能 2.锁的类型 3.锁的模式 4.查看相关信息

  46. 1.锁的功能 (1)数据一致性 (2)数据并行性 (3)数据完整性

  47. Oracle在两个不同级上提供读一致性:语句级读一致性和事务级一致性。Oracle在两个不同级上提供读一致性:语句级读一致性和事务级一致性。 (1)语句级读取一致性 (2)事务级读取一致性

  48. 2.锁的类型 Oracle锁具体分为以下几类: (1)自动锁与显示锁 按用户与系统划分,可以分为自动锁与显示锁。 ①自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁。 ②显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。

  49. (2)共享锁与排它锁 按锁级别划分,可分为共享锁与排它锁。 ①共享锁:共享锁允许相关资源可以共享,几个用户可同时读同一数据,几个事务可在同一资源上获取共享封锁。共享锁比排它锁具有更高的数据并行性。但拙劣的事务设计+共享锁容易造成死锁或数据更新丢失。 ②排它锁:事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。排它锁禁止相关资源的共享,如果一事务以排它方式封锁一资源,仅仅该事务可更改该资源,直至释放排它封锁。

  50. (3)DML锁和DDL锁 • 按操作划分,可分为DML锁、DDL锁。 • ①DML锁又可以分为:行锁、表锁、死锁。 • 行锁:当事务执行数据库插入、更新、删除操作时,该事务自动获得操作表中操作行的排它锁。 • 表锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL语句影响记录行的更新。事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用LOCK TABLE语句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用LOCK TABLE显示的定义。 • 死锁:当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就出现死锁。

More Related