从最终权威那儿获得关于 SQL 调整的帮助该权威就是 Oracle 数据库本身!使用 SQL 配置文件进行查询并了解如何使用 ADDM 来快速轻松解决常见的性能问题 迄今为止这是平静的一天在数据库中没有重大问题发生不需要去灭火您几乎可以放松一下了接下来正好可以抓紧处理那些重要任务了如对 RMAN 调整参数或多个块大小进行调整等 突然一位开发人员出现在您面前他的 SQL 查询要运行很长一段时间他问您是否能尽快调整该查询使其能够工作 也许您放松得太早了您最初的日程安排是花些时间制定战略决策以使您的数据库运行得更好更快更安全例如确保数据库是可恢复的增强底层技术或研究安全性更新等等相反您将又花一天的时间集中处理 SQL 等战术活动而很少或没有时间来考虑战略问题 作为一名战略 DBA您想把自己从日常琐事中解脱出来更多地关注那些引人深思的领域让一名助理 DBA 帮助您做那些琐事难道不好吗? 有了 Oracle 数据库 g您就有了一位自动数据库诊断监控程序 (ADDM) 形式的助理 DBA这种机器人式的 DBA 会不知疲倦地反复搜索数据库性能统计以标识瓶颈分析 SQL 语句并据此提供多种改进性能的建议它通常与其他顾问(如 SQL Tuning Advisor)一起使用在这篇文章中对该过程的工作方式进行了概述 自动数据库诊断监控程序 (ADDM) 您了解到被称作快照的自动负载信息库 (AWR)它定期从数据库中收集详细的与性能相关的度量标准每次快照后调用 ADDM 来彻底分析源自快照间差异的数据和度量标准然后就必要的操作提出建议正如我早先所提及的发现问题后ADDM 可能会依次调用其他顾问(如 SQL Tuning Advisor)来提出改进建议 我将为您完全展示(而不是用文字来解释)这种特性是如何运行的假定您正设法诊断一个不可解释的性能问题在我们介绍的示例中您知道了哪些 SQL 语句需要调整或至少知道了哪些 SQL 语句存在问题但是在现实生活中您可能没有这些有用信息 要在 g 中执行诊断您将在相关的时间间隔内选择快照进行深入透彻的分析在 Enterprise Manager g 中从 Database 主页上您将选择 Advisor Central然后单击 ADDM 链接它将出现一个类似于图 的页面 图 创建 ADDM 任务在该页中您可以创建 ADDM 要分析的任务您知道性能问题发生在晚上 点左右因此选择那个时间间隔的快照通过 Period Start 和 Period End 值进行指示您也可以单击照相机图标指示开始和终止快照的时间间隔如此处的红色椭圆形所示选择时间间隔后按下 OK 按钮将出现一个类似于图 所示的页面 图 ADDM 查找结果这里 ADDM 在该时间间隔内标识了两个关键的相关的性能问题某些 SQL 语句消耗着重要的 CPU 时间从而使数据库的速度显着减慢基于这些查找结果ADDM 建议对图中突出显示的那些语句进行 SQL 调整 如果您单击某条查找结果ADDM 会显示更多详细信息例如单击问题查找结果将会出现一个类似于图 所示的页面 图 ADDM 查找结果的详细信息在此您可以看到引发该问题的特定 SQL 语句ADDM 建议您用 SQL Tuning Advisor 对该 SQL 语句进行彻底的分析正如在 Action 部分中所提到的那样您可以通过单击它旁边的按钮立即运行该任务这将调用 SQL Tuning Advisor 在图 中您可能注意到了一个名称为 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 = 该语句调整起来并不难但是为了更容易说明问题假定它很难调整激发顾问的方式有两种使用 Enterprise Manager 或简单明了的命令行 首先让我们看看如何在命令行中使用它我们通过调用提供的包 dbms_sqltune 来调用顾问 declare l_task_id varchar(); l_sql varchar(); begin l_sql := select account_no from accounts where old_account_no = ; dbms_sqltunedrop_tuning_task (FOLIO_COUNT); l_task_id := dbms_sqltunecreate_tuning_task ( sql_text=> l_sql user_name=> ARUP scope=> COMPREHENSIVE time_limit => task_name=> FOLIO_COUNT ); dbms_sqltuneexecute_tuning_task (FOLIO_COUNT); end; / 这个包创建并执行了一个名为 FOLIO_COUNT 的调整任务接下来您将需要查看任务执行的结果(也就是说查看建议) set serveroutput on size set long select dbms_sqltunereport_tuning_task (FOLIO_COUNT) from dual; 列表 显示的是输出结果仔细查看这些建议顾问说您可以通过在 OLD_ACCOUNT_NO 列上创建一个索引来改进性能更佳的是如果创建索引顾问计算了查询成本从而使潜在的节省量变得更加可定义更加具体 当然考虑到本示例的简单性通过手动检查也能得到这种结论但是可以想象出该工具对于那些更复杂的查询十分有用因为对这些查询执行手动检查也许是不可能的或不实际的 中级调整查询重构 假定查询更复杂 select account_no from accounts a where account_name = HARRY and sub_account_name not in ( select account_name from accounts where account_no = aold_account_no and status is not null); 顾问建议如下 Restructure SQL finding (see plan in explain plans section)
The optimizer could not unnest the subquery at line ID 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 constraints or IS NOT NULL predicates Rationale
A FILTER operation can be very expensive because it evaluates the subquery for each row in the parent queryThe subquery when unnested can drastically improve the execution time because the FILTER operation is converted into a joinBe aware that NOT IN and NOT EXISTS might produce different results for NULL values 这一次顾问不会建议任何结构上的更改(如索引)但会通过用 NOT EXISTS 取代 NOT IN的方式很聪明地猜测到调整查询的正确方式由于两种构造相似但不相同顾问给出了这种改变的基本原理并把决定权留给 DBA 或应用程序开发人员由他们决定该建议是否对环境有效 高级调整SQL 配置文件 |