小编典典

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

sql

我正在使用一个定制的内部应用程序,该应用程序每周生成一组标准报告。我无权访问该应用程序的源代码,并且每个人都告诉我没有适用于Oracle数据库模式的文档。(啊!)

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

据我了解,日志无济于事,因为报告仅查询数据库;它实际上不会插入,删除或更新数据库值,因此没有什么可记录的(这是正确的吗?)。

所以我的问题是:在报表生成作业仍在运行时,是否可以使用工具或实用程序(Oracle或其他工具)查看正在执行的实际SQL语句?我认为,如果可以看到实际上正在访问哪些表以生成现有报告,那么我将有一个很好的起点来探索模式并确定要用于我自己的报告的正确SQL。


阅读 130

收藏
2021-04-15

共1个答案

小编典典

在数据字典方面,可以使用很多工具,例如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
;
2021-04-15