我正在使用一个定制的内部应用程序,该应用程序每周生成一组标准报告。我无权访问该应用程序的源代码,并且每个人都告诉我没有适用于Oracle数据库模式的文档。(啊!)
我被要求为现有报告的变体定义规格(例如,应用其他过滤器来约束数据集,并略微修改布局)。原则上,这听起来很简单,但是如果没有任何现有文档,这很难做到。
据我了解,日志无济于事,因为报告仅查询数据库;它实际上不会插入,删除或更新数据库值,因此没有什么可记录的(这是正确的吗?)。
所以我的问题是:在报表生成作业仍在运行时,是否可以使用工具或实用程序(Oracle或其他工具)查看正在执行的实际SQL语句?我认为,如果可以看到实际上正在访问哪些表以生成现有报告,那么我将有一个很好的起点来探索模式并确定要用于我自己的报告的正确SQL。
在数据字典方面,可以使用很多工具,例如Schema Spy。
要查看正在运行的查询,请查看视图sys.v_ $ sql和sys.v_ $ sqltext。您还需要访问sys.all_users
需要注意的一件事是,使用参数的查询将在以下条目中显示一次
and TABLETYPE=’:b16’
而其他不显示的内容则会出现多次,例如:
and TABLETYPE=’MT’
这些表的一个示例是使用以下SQL查找前20个磁盘读取猪的SQL。您可以通过删除 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, sql_text , u.username , round((s.disk_reads/decode(s.executions,0,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 , sharable_mem , persistent_mem , runtime_mem, cpu_time, elapsed_time, address, 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 ;