【问题标题】:How can I find in Oracle which queries are taking most of CPU time?如何在 Oracle 中找到哪些查询占用了大部分 CPU 时间?
【发布时间】:2013-09-13 21:45:25
【问题描述】:

我们有一个包含大量数据的应用程序,大约有 100 个表,其中大多数有大约 8-1000 万行,突然我们遇到了性能问题,发现 Oracle 服务器上的 CPU 使用率过高。

由于对 oracle 服务器的请求来自不同的应用程序,有没有办法在 Oracle 服务器中找出哪些查询需要更长的时间或消耗大量的 CPU?

将不胜感激回复或任何指示以找出这一点。

【问题讨论】:

  • 您使用的是哪个版本的 Oracle(企业版、标准版、XE)?您是否获得使用 AWR 的许可?是否安装了 Statspack?
  • 企业版10g
  • 好的。您是否获得使用 AWR 的许可?是否安装了 Statspack?
  • @JustinCave - 不确定 Statspack 但 DBA 确认他们可以生成 AWR。

标签: oracle oracle10g


【解决方案1】:

由于您已获得使用 AWR 的许可,并且您的 DBA 知道如何生成 AWR 报告,因此请让您的 DBA 针对 CPU 使用率过高的时间段生成 AWR 报告。在 AWR 报告中,将有许多不同的部分,其中之一是按 CPU 使用率排序的 SQL 语句。这将显示在相关时间段内哪些 SQL 语句使用的 CPU 最多。

【讨论】:

  • 谢谢贾斯汀凯夫!!
【解决方案2】:

听起来您需要生成一些 SQL 跟踪文件并使用 tkprof 分析结果。

这里有一个很好的 Ask Tom 问题,应该会告诉你如何解决这个问题:http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:969160000346108326

【讨论】:

    【解决方案3】:
    select elapsed_time/1000000 seconds, gv$sql.*
    from gv$sql
    order by elapsed_time desc;
    

    它提供的信息不如 AWR 等工具多,而且查询会定期过期。但是它运行起来非常快速和容易,而且需要的权限也更少。

    【讨论】:

    • +1。当我想快速查看共享池中当前查询的 cpu 时间分布偏差时,我通常会查询 v$sql。如果有一些 - 那么我们可能在那里遇到了瓶颈。
    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2021-02-27
    • 2011-05-11
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    相关资源
    最近更新 更多