• 使用Oracle Enterprise Manager 监视性能
• 使用自动内存管理(AMM)
• 使用内存指导调整内存缓冲区的大小
• 查看与性能相关的动态视图
• 排除无效和不可用对象产生的故障
要管理Oracle Database 11g并保持其正常运行,数据库管理员(DBA) 必须通过定期监视性能来查找瓶颈所在,然后更正问题。
DBA 可以查看的性能度量有数百种,包括从网络性能和磁盘输入/输出(I/O) 速度到运行单个应用程序操作所花费的时间等所有相关方面。这些性能度量通常称为“数据库度量”。
Enterprise Manager 中的“Performance(性能)”页是一个门户,它提供了一组功能强大的性能监视和优化工具。此页的第一组图概述了进程和活动会话活动。“Average Active
Sessions(平均活动会话数)”图中显示了CPU 使用级别及造成大多数等待事件的资源。
单击这些类别可查看有关等待时间的详细信息。I/O 数据被分为输入类型和输出类型(例如日志文件读取、控制文件写入等)。
细化到特定的等待类别后,可查看具体到五分钟时间间隔的详细资料,同时可以看见这段时间内与特定的等待事件相关联的顶级运行SQL 和顶级运行会话。这样可对系统执行速度
下降的问题进行事后分析,从而确定可能存在的原因。
示例显示了平均活动会话图形的“Concurrency(并发)”类别进行细化的结果。
单击“Performance(性能)”主页上的“Throughput(吞吐量)”和“I/O”选项卡,可以查看实例吞吐量图和实例磁盘I/O 图。上图中选择的是“Throughput(吞吐量)”选项卡。
单击“Additional Monitoring Links(其它监视链接)”部分中的“Top Consumers(顶级使用者)”会进入“Top Consumers(顶级使用者)”页。
“Top Consumers Overview(顶级使用者概览)”页以图形格式显示以下内容:
• 顶级服务
• 顶级模块(按服务统计)
• 顶级操作(按服务和模块统计)
• 顶级客户机
在“Top Consumers(顶级使用者)”页上单击“Top Sessions(顶级会话)”选项卡,可查看占用资源最多的会话的重要统计信息:
•CPU
• PGA 内存
• 逻辑读取数
• 物理读取数
• 硬性语法分析计数
• 排序计数
单击某个列名,将按照该列的值对结果进行排序。此页上的表中列出了按逻辑读取数排序的会话。
在多层系统中,如果存在作为共享数据库连接的应用程序服务器,就不能通过查看会话来获得分析性能所需要的信息。将会话按服务名称分组可以更加准确地监视性能。
在幻灯片示例中,有1个服务:SYS$BACKGROUND。无论特定请求使用什么会话,只要通过其中一个服务连接会话,会话的性能数据就会被捕获并
列在该服务名之下。
• 自动内存管理(AMM)
– 使你可以指定分配给实例的总内存(包括SGA 和PGA)
• 自动共享内存管理(ASMM):
– 使你可以通过一个初始化参数指定SGA 总内存
– 使Oracle 服务器可以管理分配给共享池、Java 池、
缓冲区高速缓存、流池和大型池的内存量
• 手动设置共享内存管理:
– 通过多个单独的初始化参数调整组件的大小
– 使用适当的内存指导提出建议
在Oracle Database 11g中,可以指定分配给实例的总内存。可以根据需要,在系统全局区(SGA) 和程序全局区(PGA) 之间动态地重新分配内存。此方法称为自动内存管理(AMM),
它仅适用于支持动态释放内存的平台。这样就简化了内存管理任务。
内存指导可帮助你在各种级别设置初始化参数。具体使用哪个指导将取决于要在哪个级别指定内存参数。如果启用了AMM,则只能使用内存大小指导。
使用自动共享内存管理(ASMM) 可以将SGA 作为整体进行管理。SGA 包含多个组件。
其中许多组件的大小都可在初始化参数限制范围内动态地进行调整,以便获得最佳性能。
启用AMM 后,ASMM 也会自动启用。如果只启用ASMM 而未启用AMM,则可使用SGA 大小指导。
通过设置各组件的初始化参数,可以手动管理该组件的大小。如果Oracle 服务器通知你出现了与SGA 或PGA 组件大小相关的性能问题,可以使用该组件的内存指导来确定适当的新设置。内存指导可以模拟参数更改的效果。
如果在配置数据库时未启用自动内存管理(AMM),可以执行以下步骤来启用它:
1. 在“Database(数据库)”主页上,单击“Server(服务器)”选项卡。
2. 在“Database Configuration(数据库配置)”区域,单击“Memory Advisors(内存指导)”。此时将显示“Memory Advisors(内存指导)”页。
3. 单击“Enable(启用)”启用自动内存管理。此时会出现“Enable Automatic Memory Management(启用自动内存管理)”页。
4. 为自动内存管理的“Total Memory Size(内存总大小)”和“Maximum Memory Size(最大内存大小)”设置适当的值。
注:如果更改“Maximum Memory Size(最大内存大小)”,必须重新启动数据库实例。
5. 单击“OK(确定)”。
以后可通过增大“Total Memory Size(内存总大小)”字段或初始化参数MEMORY_TARGET的值来增大内存总大小。但不能将该大小设置为大于“Maximum
Memory Size(最大内存大小)”字段或MEMORY_MAX_TARGET参数所指定的值。
启用AMM 后,可使用内存大小指导来帮助调整最大内存大小和目标内存大小。注:Oracle 建议使用自动内存管理来简化内存管理任务。
如果已启用AMM,则会自动启用自动共享内存管理。如果在配置数据库时未启用AMM 或ASMM,可以执行以下步骤来启用自动共享内存管理:
1. 在“Database(数据库)”主页上,单击“Server(服务器)”选项卡。
2. 在“Database Configuration(数据库配置)”区域,单击“Memory Advisors(内存指导)”。
此时将显示“Memory Advisors(内存指导)”页。
3. 向下滚动到SGA 部分。单击“Enable(启用)”启用自动共享内存管理。
此时会出现“Enable Automatic Shared Memory Management(启用自动共享内存管理)”页。
4. 指定SGA 总大小。单击“OK(确定)”。
以后可通过增大“Total SGA Size(SGA 总大小)”字段或初始化参数SGA_TARGET的值来增大SGA 的总大小。但不能将该大小设置为大于“Maximum SGA Size(最大SGA
大小)”字段或SGA_MAX_SIZE参数所指定的值。
禁用AMM 时,也可以访问PGA 指导。建议使用PGA 指导设置PGA 内存值。单击“PGA”选项卡可访问PGA 属性页。单击“Advice(建议)”调用PGA 指导。
注:Oracle 建议使用自动共享内存管理来简化内存管理任务。
如果启用了ASMM,
则不应为ASMM 所管理的特定共享内存组件设置初始化参数。启用AMM 后,可使用SGA 大小指导帮助你选择SGA 总大小的最佳值。
启用ASMM 之前,
应该从SPFILE 中删除单个内存区参数,因为设置这些参数会使
ASMM 受到限制。看到ASMM 分配的效果之后,如果决定要调整特定组件的分配值,可以为这些组件指定值。如果指定的值比目前的值小,这些值将被视为各个组件的最小内存大小。如果指定的值比目前的值大,那么只要有空闲内存,就可以将内存组件的大小重新上调至你提供的值。执行此操作会限制可用于自动调整的内存量,但在环境需要对大小进行特殊调整、而ASMM 又无法满足此需要时,可使用此功能。
相关的初始化参数如下:
• SHARED_POOL_SIZE
• LARGE_POOL_SIZE
• JAVA_POOL_SIZE
• DB_CACHE_SIZE
• STREAMS_POOL_SIZE
要在启用ASMM 后调整这些参数,必须使用ALTER SYSTEM命令。
要有效地诊断性能问题,必须使用统计信息。Oracle 服务器会在不同粒度级生成多种类型的统计信息。
在系统范围级、会话级和服务级,均会计算出等待事件和累积统计信息。在上图中,视图的顶行显示累积统计信息,底行则显示等待事件的视图。
分析其中任一范围内的性能问题时,通常会查看感兴趣的某一时段内统计信息的变化(差值)。所有可能的等待事件都会列入V$EVENT_NAME视图目录。
所有统计信息均编录在V$STATNAME视图中;Oracle DB 中大约有480 种统计信息。
显示系统范围的统计信息
示例:
sys@TEST0924> SELECT name, class, value FROM v$sysstat;
NAME CLASS VALUE
---------------------------------------------------------------- ---------- ----------
...
table scans (short tables) 64 119823
table scans (long tables) 64 20
table scans (rowid ranges) 64 0
table scans (cache partitions) 64 0
table scans (direct read) 64 0
table scan rows gotten 64 19567742
table scan blocks gotten 64 463215
...
638 rows selected.
系统范围的统计信息按优化主题和调试目的分类。这些类别包括一般实例活动、重做日志缓冲区活动、锁定、数据库缓冲区高速缓存活动等等。
上图中列出了部分视图,这些视图有助于确定导致性能问题的原因或分析数据库的当前状态。
对性能的影响:
• PL/SQL 代码对象要重新编译。
• 索引要重建。
无效PL/SQL 对象和不可用索引会对性能产生影响。无效PL/SQL 对象必须先重新编译,然后才能使用。这需要将编译时间加到尝试访问PL/SQL 程序包、过程或函数的第一个操作中。如果PL/SQL 重编译未成功,则操作会因发生错误而失败。优化程序会忽略不可用索引。如果SQL 语句性能的好坏取决于已标记为不可用的索引,则只有重建索引才能改善性能。
无效PL/SQL 对象:可通过查询数据字典来查看PL/SQL 对象的当前状态。可使用以下命令行查找到无效PL/SQL 对象:
SELECT object_name, object_type FROM
DBA_OBJECTS WHERE status = 'INVALID';
默认情况下,每24 小时会检查一次“所有者的无效对象计数”度量。如果单个所有者的对象数超过两个,就会发出预警。
如果查找到INVALID状态的PL/SQL 对象,需要回答的第一个问题是“此对象曾经是VALID的吗?”应用程序开发人员常常会忘记清除不起作用的代码。如果PL/SQL 对象因
代码错误而无效,则除了纠正代码错误之外,没有什么别的方法。如果该过程在过去曾经有效,最近才变为无效,则可选择以下两种方法解决这个问题:
• 不做任何处理。如果需要,大多数PL/SQL 对象在被调用时会自动重新编译。用户在对象重新编译时会经历短暂的延迟。(大多数情况下,这种延迟不十分明显。)
• 手动重新编译无效对象。
使用Enterprise Manager 或通过SQL 命令可手动重新编译无效的PL/SQL 对象:
ALTER PROCEDURE HR.add_job_history COMPILE;
手动重新编译PL/SQL 数据包,需要执行以下两个步骤:
ALTER PACKAGE HR.maintainemp COMPILE;
ALTER PACKAGE HR.maintainemp COMPILE BODY;
不可用索引:可通过查询
DBA_INDEXES数据字典视图查找无效索引:
SELECT index_name, table_name FROM DBA_INDEXES WHERE status = 'UNUSABLE';
对于分区索引,状态保存在DBA_IND_PARTITIONS视图中。
通过重建不可用索引来重算指针,可使不可用索引变为有效。重建不可用索引会在新位置重新创建索引,然后会删除不可用索引。
使用Enterprise Manager 或通过SQL 命令可完成此操作:
ALTER INDEX HR.emp_empid_pk
REBUILD;
ALTER INDEX HR.emp_empid_pk
REBUILD ONLINE;
ALTER INDEX HR.email
REBUILD TABLESPACE USERS;
如果省略了TABLESPACE子句,则会在索引曾经所在的相同表空间中重建索引。
使用REBUILD ONLINE子句,用户可以在重建时继续更新索引表。(如果不使用ONLINE关键字,用户必须等待重建完成后才能对受影响的表执行DML。如果索引不可用,即便
使用了ONLINE关键字,也不会在重建过程中使用该索引。)
Enterprise Manager 使用“Reorganize(重组)”操作修复UNUSABLE索引。
注:重建索引时需要有可用于重建的空闲空间。请在尝试重建前验证是否有足够的空间。Enterprise Manager 会自动检查空间要求。