如何查看正在执行的实际Oracle SQL语句

前端之家收集整理的这篇文章主要介绍了如何查看正在执行的实际Oracle SQL语句前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用一个定制的内部应用程序,每周生成一组标准的报告。我没有访问应用程序的源代码,每个人都告诉我没有可用于Oracle数据库模式的文档。 (Aargh!)

我们被要求定义现有报表变体的规范(例如,应用其他过滤器来约束数据集,并稍微修改布局)。这听起来很简单,原则上,但是没有任何现有的文档是困难的。

这是我的理解,日志不能帮助我,因为报告只查询数据库;它实际上不插入,删除或更新数据库值,所以没有什么可以记录(这是正确的吗?)。

所以我的问题是这样:是否有一个工具或实用程序(Oracle或其他),我可以用来查看在报表生成作业仍在运行时执行的实际sql语句?我想,如果我能看到实际被访问的表,以产生现有的报告,我将有一个很好的起点探索架构和确定正确的sql用于我自己的报告。

在数据字典端有很多工具可以使用,如 Schema Spy

要查看正在运行的查询,请查看sys.v_ $ sql和sys.v_ $ sqltext视图。您还需要访问sys.all_users

需要注意的是,使用参数的查询将会显示一次,例如

and TABLETYPE=’:b16’

而其他不会多次显示,如:

and TABLETYPE=’MT’

这些表的操作示例是以下sql查找前20个磁盘盘。您可以通过删除WHERE rownum< = 20来更改此值,也可以添加ORDER BY模块。你经常发现模块会告诉你什么软件运行查询(例如:“TOAD 9.0.1.8”,“JDBC Thin Client”,“runcbl @ someBox(TNS V1-V3)”等)

SELECT 
 module,sql_text,username,disk_reads_per_exec,buffer_gets,disk_reads,parse_calls,sorts,executions,rows_processed,hit_ratio,first_load_time,sharable_mem,persistent_mem,runtime_mem,cpu_time,elapsed_time,address,hash_value 
FROM 
  (SELECT
   module,u.username,round((s.disk_reads/decode(s.executions,1,s.executions)),2)  disk_reads_per_exec,s.disk_reads,s.buffer_gets,s.parse_calls,s.sorts,s.executions,s.rows_processed,100 - round(100 *  s.disk_reads/greatest(s.buffer_gets,1),2) hit_ratio,s.first_load_time,hash_value 
  FROM
   sys.v_$sql s,sys.all_users u 
  WHERE
   s.parsing_user_id=u.user_id 
   and UPPER(u.username) not in ('SYS','SYSTEM') 
  ORDER BY
   4 desc) 
WHERE
 rownum <= 20;

注意,如果查询是长的..你将必须查询v_ $ sqltext。这存储整个查询。您将必须查找ADDRESS和HASH_VALUE并拾取所有的片段。例如:

SELECT
 *
FROM
 sys.v_$sqltext
WHERE
 address = 'C0000000372B3C28'
 and hash_value = '1272580459'
ORDER BY 
 address,hash_value,command_type,piece
;
原文链接:https://www.f2er.com/oracle/206620.html

猜你在找的Oracle相关文章