监控程序:Oracle的自动数据库诊断监控程序剖析

="t18"> 从最终权威那儿获得有关 SQL 调整帮助:该权威就是 Oracle 数据库本身!使用 SQL 配置文件进行查询并了解如何使用 ADDM 来快速、轻松解决常见性能问题 迄今为止这是平静天:在数据库中没有重大问题发生不需要去灭“火”您几乎可以放松下了;接下来正好可以抓紧处理那些重要任务了如对 RMAN 调整参数或多个块大小进行调整等 忽然位开发人员出现在您面前 SQL 查询要运行很长段时间他问您是否能尽快调整该查询使其能够“工作” 也许您放松得太早了您最初日程安排是花些时间制定战略决策以使您数据库运行得更好、更快、更安全例如确保数据库是可恢复增强底层技术或研究安全性更新等等相反您将又花时间集中处理 SQL 等战术活动而很少或没有时间来考虑战略问题 作为名战略 DBA您想把自己从日常琐事中解脱出来更多地关注那些引人深思领域名助理 DBA 帮助您做那些琐事难道不好吗? 有了 Oracle 数据库 10g您就有了位自动数据库诊断监控 (ADDM) 形式助理 DBA这种机器人式 DBA 会不知倦怠地反复搜索数据库性能统计以标识瓶颈、分析 SQL 语句、并据此提供多种改进性能建议它通常和其他“顾问”(如 SQL Tuning Advisor)起使用在这篇文章中对该过程工作方式进行了概述 自动数据库诊断监控 (ADDM) 在第 6 周您了解到被称作快照自动负载信息库 (AWR)它定期从数据库中收集具体和性能相关度量标准每次快照后 ADDM 来彻底分析源自快照间差异数据和度量标准然后就必要操作提出建议正如我早先所提及发现问题后ADDM 可能会依次其他顾问(如 SQL Tuning Advisor)来提出改进建议 我将为您完全展示(而不是用文字来解释)这种特性是如何运行假定您正设法诊断个不可解释性能问题在我们介绍举例中您知道了哪些 SQL 语句需要调整或至少知道了哪些 SQL 语句存在问题但是在现实生活中您可能没有这些有用信息 要在 10g 中执行诊断您将在相关时间间隔内选择快照进行深入、透彻分析在 Enterprise Manager 10g 中从 Database 主页上您将选择 "Advisor Central"然后单击 "ADDM" 链接它将出现个类似于图 1 页面
Oracle<img src='/icons/28609de.gif' />自动数据库诊断监控<img src='/icons/28609chengxu.gif' />剖析(图<img src='/icons/28609yi.gif' />)
  
图 1:创建 ADDM 任务
在该页中您可以创建 ADDM 要分析任务您知道性能问题发生在晚上 11 点左右因此选择那个时间间隔快照通过 "Period Start" 和 "Period End" 值进行指示您也可以单击照相机图标指示开始和终止快照时间间隔如此处红色椭圆形所示选择时间间隔后按下 "OK" 按钮将出现个类似于图 2 所示页面
Oracle<img src='/icons/28609de.gif' />自动数据库诊断监控<img src='/icons/28609chengxu.gif' />剖析(图 2)
  
图 2:ADDM 查找结果
这里 ADDM 在该时间间隔内标识了两个要害、相关性能问题:某些 SQL 语句消耗着重要 CPU 时间从而使数据库速度显著减慢基于这些查找结果ADDM 建议对图中突出显示那些语句进行 SQL 调整 假如您单击某条查找结果ADDM 会显示更多具体信息例如单击问题查找结果将会出现个类似于图 3 所示页面
Oracle<img src='/icons/28609de.gif' />自动数据库诊断监控<img src='/icons/28609chengxu.gif' />剖析(图 3)
  
图 3:ADDM 查找结果具体信息
在此您可以看到引发该问题特定 SQL 语句ADDM 建议您用 SQL Tuning Advisor 对该 SQL 语句进行彻底分析正如在 "Action" 部分中所提到那样您可以通过单击它旁边按钮立即运行该任务这将 SQL Tuning Advisor 在图 2 中您可能注重到了个名称为 "View Report" 按钮除了在单独 Web 页面中提供建议外ADDM 还能够创建纯文本报表以进行更快速步到位分析在我们举例纯文本报表中提出全面建议注重报表是如何给出相关细节如所考虑 SQL 语句、它散列值等可以在 Enterprise Manager SQL Tuning Advisor 页中或通过命令行将 SQL ID 用于独立分析 在收集了每张 AWR 快照后就会 ADDM因此可以查看基于相邻快照建议因此假如分析范围只是两张相邻快照就不必创建上面所示 ADDM 任务假如您想在两张不相邻快照的间进行分析就需要创建 ADDM 任务
记住 ADDM 所能做远不止这些;正如您在以前文章中所看到它还提供内存治理、段治理、重作/撤消以及更多分析和建议由于在篇简短文章中描述所有 ADDM 功能是不可能在此我们只关注 SQL Tuning Advisor现在让我们看看它是如何工作 用 SQL Tuning Advisor 访问分析 在个典型运行时优化中优化器生成组可能访问路径并基于对象统计从中选择出最“经济”路径 但是那时它没有时间考虑是否能够调整语句、统计是否陈旧、是否能够创建索引等问题相反SQL Tuning Advisor 可以执行这种“专家系统”类型研究实质上优化器能够回答问题是:“基于可用资源,获得结果最佳方式是什么?”而 SQL Tuning Advisor 能够回答问题是:“基于用户需求还需要做些什么来增强性能?” 正如您可能预期那样这种“研究”消耗了资源(如 CPU);因此 SQL Tuning Advisor 在调整模式期间处理 SQL 语句该模式可以在非高峰时间运行在创建调整任务时通过在中设置 SCOPE 和 TIME 参数来指示这种模式在数据库活动少期间运行调整模式是个好思路方法以使常规用户相对不受影响稍后再进行分析 这个概念可以通过举例很好地解释就看看如下所示开发人员引起您注重那个查询事例吧
  select account_no from accounts where old_account_no = 11

   该语句调整起来并不难但是为了更轻易介绍说明问题假定它很难调整激发顾问方式有两种:使用 Enterprise Manager 或简单明了命令行 首先让我们看看如何在命令行中使用它我们通过提供包 dbms_sqltune 来顾问
  declare   l_task_id   varchar2(20);   l_sql     varchar2(2000);   begin   l_sql := 'select account_no from accounts where old_account_no = 11';   dbms_sqltune.drop_tuning_task ('FOLIO_COUNT');   l_task_id := dbms_sqltune.create_tuning_task (   sql_text => l_sql,   user_name => 'ARUP',   scope   => 'COMPREHENSIVE',   time_limit => 120,   task_name => 'FOLIO_COUNT'   );   dbms_sqltune.execute_tuning_task ('FOLIO_COUNT');   end;   /

   这个包创建并执行了个名为 FOLIO_COUNT 调整任务接下来您将需要查看任务执行结果(也就是说查看建议)
   serveroutput _disibledevent=>
  select account_no from accounts a   where account_name = 'HARRY'   and sub_account_name not in   ( select account_name from accounts   where account_no = a.old_account_no and status is not null);
   顾问建议如下:
  1- RestrUCture SQL finding (see plan 1 in eXPlain plans section)   ----------------------------------------------------------------   The optimizer could not unnest the subquery at line ID 1 of the execution   plan.   Recommendation    --------------   Consider replacing "NOT IN" with "NOT EXISTS" or ensure that columns used on both sides of the "NOT IN" operator are declared "NOT NULL" by adding   either "NOT NULL" constras or "IS NOT NULL" predicates.   Rationale    ---------   A "FILTER" operation can be very expensive because it evaluates the subquery for each row in the parent query.The subquery, when unnested can   drastically improve the execution time because the "FILTER" operation is   converted o a join.Be aware that "NOT IN" and "NOT EXISTS" might   produce dferent results for "NULL" values.

   这次顾问不会建议任何结构上更改(如索引)但会通过用 NOT EXISTS 取代 NOT IN方式很聪明地猜测到调整查询正确方式由于两种构造相似但不相同顾问给出了这种改变基本原理并把决定权留给 DBA 或应用开发人员由他们决定该建议是否对环境有效
Tags:  监控程序

延伸阅读

最新评论

发表评论