我正在尝试加入两个表 v$sql 和 v$session 我这个查询的目的是知道谁是使用机器的用户以及他使用的 sql 是什么。
我正在寻找类似的东西
select s.sql_text
, i.osuser
from v$sql s
, v$session i
where i.something= s.something
and i.osuer='MOUDIZ'
我正在尝试加入两个表 v$sql 和 v$session 我这个查询的目的是知道谁是使用机器的用户以及他使用的 sql 是什么。
我正在寻找类似的东西
select s.sql_text
, i.osuser
from v$sql s
, v$session i
where i.something= s.something
and i.osuer='MOUDIZ'
我看到你对这两种观点之间的差异有一个悬而未决的问题。
v$sql 详细信息——如果您有多个查询副本:
“从 T 中选择 *”
在您的共享池中, v$sql 每个查询都会有一行。如果用户 U1 和用户 U2 都有一个表 T 并且都发出“select * from T”,则可能会发生这种情况。这些是具有不同计划的完全不同的查询等等。v$sql 将有 2 行。
v$sqlarea 是 v$sql 的聚合。它选择出 DISTINCT sql。“从 T 中选择 *”将出现在那里。
汤姆在这里回答了https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::p11_question_id:385254862843
select s.USERNAME,
a.SQL_TEXT
from v$session s
join v$sqlarea a on ( a.ADDRESS = s.SQL_ADDRESS )
where s.OSUSER = 'MOUDIZ'
它只会显示用户现在正在做什么。
这将显示所有当前打开的游标:
select s.username, cast(substr(q.SQL_FULLTEXT,1,4000) as varchar2(4000)) sql_text
from v$session s
join v$open_cursor c on ( s.SADDR = c.SADDR )
join v$sql q on ( q.SQL_ID = c.SQL_ID )
and s.OSUSER = 'MOUDIZ';