如何在 Oracle 中找到哪些查询占用了大部分 CPU 时间?
Posted
技术标签:
【中文标题】如何在 Oracle 中找到哪些查询占用了大部分 CPU 时间?【英文标题】:How can I find in Oracle which queries are taking most of CPU time? 【发布时间】: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。 【参考方案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。如果有一些 - 那么我们可能在那里遇到了瓶颈。以上是关于如何在 Oracle 中找到哪些查询占用了大部分 CPU 时间?的主要内容,如果未能解决你的问题,请参考以下文章