我正在使用一个定制的内部应用程序,每周生成一组标准报告.我无法访问应用程序的源代码,每个人都告诉我没有可用于Oracle数据库架构的文档.(AARGH!)
我被要求为现有报告的变体定义规范(例如,应用其他过滤器来约束数据集,并稍微修改布局).原则上这听起来很简单,但没有任何现有文档很难.
我的理解是日志无法帮助我,因为报告只查询数据库; 它实际上并不插入,删除或更新数据库值,因此没有任何记录(这是正确的吗?).
所以我的问题是:是否有一个工具或实用程序(Oracle或其他),我可以使用它来查看报告生成作业仍在运行时正在执行的实际SQL语句?我想,如果我能看到实际访问哪些表来生成现有报告,那么我将有一个非常好的起点来探索模式并确定用于我自己的报告的正确SQL.
在数据字典方面,您可以使用许多工具,例如Schema Spy
要查看正在运行的查询,请查看视图sys.v_ $ sql和sys.v_ $ sqltext.您还需要访问sys.all_users
有一点需要注意,使用参数的查询将显示一次条目,如
and TABLETYPE=’:b16’
而其他不会多次出现的,例如:
and TABLETYPE=’MT’
这些表的一个示例是使用以下SQL来查找前20个diskread hog.您可以通过删除WHERE rownum <= 20并可能添加ORDER BY模块来更改此设置.您经常会发现该模块将为您提供关于运行查询的软件的模糊线索(例如:"TOAD 9.0.1.8","JDBC瘦客户端","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 ;
对不起,简短的回答,但已经很晚了.Google"oracle event 10046 sql trace".最好跟踪单个会话,因为如果它是共享的sql并被多个用户使用,那么从v $ sql中确定哪个SQL属于哪个会话并不容易.
如果您想给您的Oracle DBA朋友留下深刻印象,请了解如何使用事件10046设置oracle跟踪,解释等待事件的含义并找到顶级cpu使用者.
Quest有一个免费的产品,允许您从客户端发出SQL,但不确定它是否适用于您的Oracle产品/版本.谷歌"任务oracle sql监视器"为此.
晚安.