如何在数据库中找到最新的SQL语句?

我喜欢获取数据库中最新执行的语句,以及性能指标。 因此,我想知道哪些SQL语句对CPU/磁盘的消耗最大。

http://stackoverflow.com/questions/14830875/find-out-the-history-of-sql-queries - Vadzim
4个回答

这是执行任务的SQL。可供试用。 步骤1:确定安装ID和用户ID。
SELECT inst_id,sid FROM gv$session WHERE username='<ENTER-USERNAME>';
第二步:
SELECT 
      s.sid
     ,s.CLIENT_INFO
     ,s.MACHINE
     ,s.PROGRAM
     ,s.TYPE
     ,s.logon_time
     ,s.osuser
     ,sq.sorts
     ,sq.DISK_READS
     ,sq.BUFFER_GETS
     ,sq.ROWS_PROCESSED
     ,sq.SQLTYPE
     ,sq.SQL_TEXT
 FROM gv$session s    
    , gv$sql sq
WHERE s.SQL_HASH_VALUE = sq.HASH_VALUE
  AND s.inst_id = :inst_id -- replace with instID from above
  AND s.sid = :sid -- replace with ID from above
  AND sq.inst_id = s.inst_id
可能会返回多个Id和实例Id。因此,用户可以根据自己的选择在Web界面等地方使用这些数据。

只是一个小提示:Oracle支持(不知道从哪个版本开始)使用元组的in操作符,所以从上面的例子中可以看到... AND (s.inst_id, s.sid) in ( (:id1, :sid1), (:id2, :sid2), ... ) - Betlista
1'inst_id'代表实例ID,而非安装ID。 - miracle173

Oracle企业监视器控制台显示了关于哪些SQL查询占用最多的CPU、瓶颈、数据库中的顶级活动、阻塞SQL等大量信息。

对于历史方法,您可以使用Oracle的AWR报告来确定与您相关的区域。

alt text

enter image description here


1出于好奇,AWR是适用于所有Oracle许可证的工具,我能否仅通过命令行使用它? - Sebastian Roth
2抱歉,我应该提到一下 - 据我所知,AWR需要单独的许可证 - Oracle Tuning & Diagnostic Pack。我更喜欢使用Enterprise Manager控制台中的AWR - 我有幸能够使用Enterprise Manager控制台。我还发现你可以使用SQL Developer来监视SQL语句,但这需要上述的许可证。 - Sathyajith Bhat
1Oracle Enterprise Manager (OEM)非常好用。我们可以通过自动刷新的图表实时监控数据库的健康状况。我们在墙上挂了一台大屏幕,24小时不间断地显示主要数据库的OEM,这对于及时发现问题非常有帮助。 - ScottCher

你还可以使用V$SQL,其中有几个有趣的列RUNTIME_MEM, EXECUTIONS, DISK_READS, SORTS, ELAPSED_TIME, SQL_FULLTEXT等等。 这将按磁盘读取次数给出前10个语句(注意 - 这是所有执行的累计值)。
select sql_id,child_number from
(
select sql_id,child_number from v$sql
order by disk_reads desc
)
where rownum<11
如果语句仍然在V$SQL_PLAN中,您可以获取查询的实际执行计划:
select * from table(dbms_xplan.display_cursor('sql_id',child_number));
我也喜欢使用V$SQL_PLAN,因为它包含了很好的信息。如果你的statistics_level=ALL,你可以使用V$SQL_PLAN_STATISTICS

最近的SQL:
select * from v$sql

关于历史:

select * from dba_hist_sqltext