我使用一个定制的内部应用程序,每周生成一组标准的报告。我没有访问应用程序的源代码,每个人都告诉我没有可用于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 ;