首页 文章

在Oracle 11g中自动执行问题查询识别

提问于
浏览
2

在我们的测试台中,许多测试套件将连续运行(无人值守),生成报告供以后使用 . 我希望在这些报告中包含可供进一步调查的候选查询,以及证明其被列入该列表的数据 . 我们应该能够将以这种方式识别的任何查询与将其暴露为关注的测试套件相关联 .

当我们使用SQL Server时,这是相对简单的 - 在套件开始之前调用DBCC FREEPROCCACHE清除所有计数器,然后在测试结束时我们对sys.dm_exec_query_stats运行查询,这使我们可以访问执行计数和min / max /每个缓存查询计划的总时间,可以使用钩子检索参数化的SQL语句(我们在mssql实例中使用FORCED参数化)和查询计划 .

参考:http://msdn.microsoft.com/en-us/library/ms189741%28SQL.90%29.aspx

我的问题:当我的目标应用程序连接到Oracle 11g时,如何实现此近似值?到目前为止,我的阅读表明,我所追求的一切都可以通过AWR获得,并且应该可以直接访问支持视图,但我无法自己关闭这个圆圈 .

4 回答

  • 1

    为什么需要直接访问支持视图?在我看来,最简单的解决方案是

    • 每个测试套件通过显式生成AWR快照来开始和结束,因此它知道开始和结束快照ID,因此您可以单独为每个套件生成AWR报告 .

    • 您为每个测试套件运行AWR报告

    • 您查看AWR报告,特别是查看各种Top SQL部分

    绝对可以直接从底层视图中获取所有信息,但如果您不需要这样做,那显然更容易 .

    为了理智,我应该指出,我假设您已获得使用AWR的许可 . 从技术上讲,即使查询AWR视图,也需要获得Performance and Tuning Pack的许可 . 如果您想直接点击视图而不是因为许可问题而生成完整的AWR报告,那么您不会通过点击视图来节省任何许可证的麻烦 .

  • 0

    相当于DBCC FREEPROCCACHE的Oracle

    SQL> alter system flush shared_pool;
    
  • 0

    最接近SQL Server计数器的是V$SYSSTATV$SYSTEM_EVENT . 但是,Oracle在会话级别实际上也会在v $ SESSION_WAIT,V $ SESSION_WAIT_CLASS和V $ SESSION_EVENT中跟踪这些内容,因此您不需要诊断/调整包许可证来访问它们 .

    它们不会降低到SQL级别 . 这在V $ SQL中可用,但不是特定于该会话 . 您可以使用session level tracing来跟踪可能导致问题的各个SQL

  • 0

    贾斯汀的答案有正确的轮廓,但我需要更多有关实施的细节 .

    每个测试套件通过显式生成AWR快照来开始和结束,以便它知道开始和结束快照ID,以便您可以单独为每个套件生成AWR报告 . 您为每个测试套件运行AWR报告您可以查看AWR报告,特别是查看各种Top SQL部分

    • 我通过调用dbms_workload_repository.create_snapshot显式生成快照,结果将保存,以备日后使用 .

    从dual中选择dbms_workload_repository.create_snapshot()作为snap_id

    • 为了获取报告,我需要数据库ID和实例编号 . 这些很容易从v $ database和v $ instance获得 .

    从v $ database d,v $ instance i中选择d.DBID,i.instance_number为inst_num

    • 该报告以文本(dbms_workload_repository.awr_report_text)或html(dbms_workload_repository.awr_report_html)的形式提供 . 两种情况下的参数都相同,包括选项标志,其中包含来自自动诊断数据库监视器(ADDM)的信息 . 对我来说,我可以利用ADDM结果并不是很明显,所以我将其关闭 . 返回值是varchar的列,因此函数调用将被包装

    从表中选择输出(dbms_workload_repository.awr_report_html(1043611354,1,5539,5544,0))

    • 此结果很容易写入文件,该文件与测试的其他工件组合在一起 .

    Documentation of these methods is available online

相关问题