http://www.toadworld.com/KNOWLEDGE/KnowledgeXpertforOracle/tabid/648/TopicID/OPS3/Default.aspx
对 Oracle 调优应该采取积极的态度。如果等到用户开始抱怨性能,才调优通常以为时已晚,即便是最有效的调优策略。性能问题确定和处理的时间越晚,那么解决问题的时间和资源成本就越多。当出现不可预见的性能问题时,DBA 的责任是尽早查明原因,并尽快纠正问题,越快越好。
在你开始任何调优前,需要建立一套与调优直接有关的量化目标。调优时,时刻记住你的目标。你的优化目标应该是具体的,可量化的,而不是泛泛的。
调优 Oracle 前,确保操作系统正执行在高峰期。用操作系统管理员身份,利用操作系统监控工具,检查非 Oracle 应用程序对分页和交换资源的竞争。操作系统可能需要把信息从一个存储区域移动到另一个,以容纳不适合在实际内存中的更大信息。这个过程称为分页(paging)和交换(swapping)。过度的分页和交换会降低性能。
最好的调优方法是一个结构化的方法。确保操作系统处于高峰期,并有足够的操作系统资源分配给Oracle 系统,接下来你可以按如下顺序调优:
- 应用程序负载
- 调优竞争
- 最小化物理 IO
- 优化物理 IO
- 最佳实践
优化应用程序负载
开发者在用有效的 SQL 语句编写应用程序中扮演重要角色。他们应该利用指示、索引,以及必要时为获得较好性能而绑定变量。不要低估应用程序调优的重要性。千万不要低估应用程序调优的重要性。将近 80% 的性能获得都是通过应用程序调优。
应用程序开发者应对 Oracle SQL 处理有一个深刻的理解。包括:
- DML(数据操纵语言)
- DDL(数据定义语言)
- 事务控制
- 共享 SQL 和 PL/SQL 区
- 优化器模式
- 并行查询
对开发者来说,重要的是尽可能使用 PL/SQL,因为 PL/SQL包以已解析的格式存储。如果需要,包可以被存储在共享池以提高性能。
数据库设计和应用程序设计可能不是 DBA 的工作。但是,你应该知道适当的最初设计的重要性,如果必要的话,能够指导设计者和开发者来实现这个目标。强烈推荐,所有涉及开发和维护 Oracle 的人员要有适当培训,让他们了解应用系统使用的 Oracle 版本。要注意的是,你可以有一个现成的很好的调优实例。该实例可能是因为不好的数据库设计,或应用程序内编写的 SQL 性能很差,所造成的整体运行很差。
调优竞争
当两个进程都需要某个资源时,一个进程需要另一个使用完后才能使用,就会发生竞争。这会导致进程等待 Oracle 系统的资源,影响性能。
闩锁竞争发生在 SGA 中的库高速缓存、缓冲区高速缓存和日志缓冲区。回滚段的竞争也会导致系统性能变差。回滚段用于存储事务和回滚、读取一致性以及恢复的撤销信息。当事务经历等待回滚段时,就会发生竞争。必须确保你有足够的回滚段数量和正确的段大小。
最小化物理 IO
一旦你有了一个设计良好的模型和已正确调优的应用程序,DBA 主要的调优责任才真正开始。内存结构的正确大小可以让足够的信息存储在内存。由于内存访问比磁盘访问更快,与从磁盘相比,它总是能更好地满足在内存中的信息请求。调优内存分配包括把内存正确地分布给每个 Oracle 内存区域,同时,确保在操作系统级别不会发生分页和交换。
系统全局区(system global area,SGA)是保存关于最常用的请求数据库信息的内存区域。当数据库启动时,分配 SGA,并在后台启动。SGA 和后台进程一起被称为实例。SGA 分为三个存储组件:
- 缓冲区高速缓存(Buffer cache)
- 共享池(Shared pool)
- 重做日志缓冲区(Redo log buffers)
缓冲区高速缓存是 SGA 的区域,其存储从数据库段读取的数据块的副本。这些数据块包括表、聚簇、回滚段和索引。每个缓冲区拥有一个单独的 Oracle 数据块。缓冲区高速缓存的大小,以字节为单位,由数据库初始化文件参数 DB_BLOCK_BUFFERS 乘以 DB_BLOCK_SIZE 来确定。一旦数据库被创建,缓冲区高速缓存的大小只能通过 DB_BLOCK_BUFFERS 来改变;而 DB_BLOCK_SIZE 参数自创建数据库后就不能被改变。当设置正确的数据库缓冲区高速缓存的大小,通过从内存请求数据块,而不是从磁盘,性能就可以被优化。
共享池也是SGA 的一个区域,它包含两个主要的存储区:库高速缓存和字典高速缓存。库高速缓存由共享和私有的 SQL 区域、PL/SQL 包和存储过程,以及控制结构。当库高速缓存没有足够的内存时,不会再有可用的空间来缓存新的语句,直到旧的语句被删除,腾出空间。任何被删除,不再需要的语句都将被重新解析。库高速缓存报告中对于重新装载和无效列值的大数值显示了过多的重新解析。重新解析的存储过程会要求 CPU 和 IO 资源。为了避免在库高速缓存中卸载并重新加载大对象,应确保 SHARED_POOL_SIZE 值足够大,并且保证,当函数、存储过程和包加载到数据库时,尽可能无需再解析。
字典高速缓存存储数据库的信息,它们结构和使用者。字典高速缓存中的信息包括段名、用户、权限和扩展位置。在大多数操作放到 Oracle 数据库之前,必须读取数据字典表,并被存储在数据字典缓存区。无论是缓冲区高速缓存,还是库高速缓存,字典高速缓存的效率由命中率来决定。字典高速缓存的大小间接与数据库初始化文件参数 SHARED_POOL_SIZE 有关。
如果你正运行在一个多线程服务器(multithreaded server,MTS)环境中,用户会话信息,如私有 SQL 和排序区域,被存储在共享池中,而不是用户进程的内存。如果你使用一个 MTS,你可能需要让你的共享池大点,以容纳额外的由把排序信息移动到用户全局区(user global area,UGA)引起的内存需求。共享池的大小由数据库初始化文件参数 SHARED_POOL_SIZE 来确定。库高速缓存和字典高速缓存的大小受共享池的大小限制。
重做日志缓冲区是 SGA 的一个区域,用来记录对数据库所做的所有更改。信息被定期从重做日志缓存写道联机重做日志文件,这样,如果需要恢复,就可以应用。重做日志缓存区的大小,以字节计算,是由数据库初始化文件参数 LOG_BUFFER 指定。
优化物理 IO
若在你的系统上获得最大的性能,通过把 Oracle 数据库文件分散到多个设备,均匀地把 IO 分布开。当多个进程试图同时访问同一个磁盘时,就会发生磁盘竞争。当达到访问磁盘的最大数量时,其他进程就得等待。
在 SYSTEM 表空间上过多的 I/O 可能表明共享池太小,从而导致对数据字典过多的物理读写,而数据字典位于 SYSTEM 表空间。
在 SYSTEM 表空间上另一个严重的 I/O 可能原因是,没有指定用户默认的表空间。确保数据段不要写到 SYSTEM 表空间。如果创建一个用户,没有默认分配默认表空间,那么用户默认的表空间是 SYSTEM。总是分配一个非 SYSTEM 默认表空间给用户。
如果排序段写到了 SYSTEM 表空间,那么会导致过多的 I/O。如果创建一个用户,而没有分配临时表空间,那么用户将在 SYSTEM 表空间执行所有的排序。总是分配一个非 SYSTEM 表空间的临时表空间给用户。
最佳实践
最佳实践是一个被普遍接受的指南。它们经过了时间的考验。最佳实践并没有具体的设置。
下面是一些最佳实践,它们的好处包括:
- 整个企业的一致环境。提供不同技术组的技术共识,并消除完成方法的竞争。
- 使用已证明的,经过时间验证的重现性好,成功的结果,尝试过的最佳实践。
- 容易诊断问题。如果一个给定的系统并不是以标准方式安装,这通常将会很快显现出来。
- 降低管理系统的整体成本。