对于DBA来说,这是一个非常常见的问题,DBA需要找出以下问题:
1、哪些用户在跑哪些SQL?
2、一个特定的SQL是被哪个用户在执行?
3、一个特定的用户在跑哪些SQL?
从这些问题中可以很明显的看出来,这些问题都是指当前,此刻发生的。事实上,还可以获得更多类似的内容:
1、当前登录数据库的有哪些用户?
2、哪些计算机在被用户登录?
3、一个SQL跑了多久了?
所有以上这些问题都对你的数据库性能调优有关。在ORACLE数据库中可能存在性能低下的SQL语句,这时候你就需要识别用户,SQLs,以便来解决这些性能低下的SQL.
所有这些信息都在以v$开头的表中。比如v$session和v$sqlarea。
如果你有以上2个表的权限,可以执行以下语句:
SELECT SUBSTR(SS.USERNAME,1,8) USERNAME, SS.OSUSER "USER", AR.MODULE || ' @ ' || SS.machine CLIENT, SS.PROCESS PID, TO_CHAR(AR.LAST_LOAD_TIME, 'DD-Mon HH24:MM:SS') LOAD_TIME, AR.DISK_READS DISK_READS, AR.BUFFER_GETS BUFFER_GETS, SUBSTR(SS.LOCKWAIT,1,10) LOCKWAIT, W.EVENT EVENT, SS.status, AR.SQL_fullTEXT SQL FROM V$SESSION_WAIT W, V$SQLAREA AR, V$SESSION SS, v$timer T WHERE SS.SQL_ADDRESS = AR.ADDRESS AND SS.SQL_HASH_VALUE = AR.HASH_VALUE AND SS.SID = w.SID (+) AND ss.STATUS = 'ACTIVE' AND W.EVENT != 'client message' ORDER BY SS.LOCKWAIT ASC, SS.USERNAME, AR.DISK_READS DESC
通过该语句,可以得到你想要的信息,截图如下:
我的公众号: