我目前正在帮助一些组织提高他们的 Oracle 数据库性能。他们在 Windows 2008 中使用 Oracle 11gR2 标准版。由于此标准版没有可用的企业性能包,我不得不使用 v$sql 查询运行时间最长的包以确定性能瓶颈。使用下面的查询:
SELECT *
FROM (
SELECT sql_text,
sql_id,
elapsed_time,
plsql_exec_time,
cpu_time,
executions,
fetches,
loads,
buffer_gets,
elapsed_time / executions
FROM v$sql -- order by elapsed_time / executions) ) where rownum <= 10;
它返回了一些我将研究的查询,但结果中有两行我无法理解为什么它们应该存在于此处:
如您所见,查询执行于sys.job$
,因此它应该与在此数据库上设置的 oracle 作业有关。我的问题是:
1)这两行是什么意思?我应该查询dba_jobs
表以获取更多信息吗?我应该如何查询它们以及我应该寻找什么?
2)两个查询看起来一样,为什么在查询结果中回显了两次?
如果这是您最耗时的查询,那么您的数据库几乎什么都不做。
即每次执行时间为 0.211599 秒和 0.002923 秒,总运行时间为 39.9 秒和 1.7 秒。
order by elapsed_time / executions) ) where rownum <= 10;
这将返回运行时间最短的查询,而不是运行时间最长的查询。使用
order by ... desc
.不。这是一个内部语句,它在启动作业时用作业的开始时间更新字典。没有什么可调查的。
您应该在 V$SQL_SHARED_CURSOR中找到此信息。查找值为 的列,该
Y
列的名称指定了具有另一个子游标的原因。