如何查看正在执行的实际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 ; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |