v$session,v$process,v$mystat,v$statname剖析(还算不错)

本文深入解析了Oracle数据库中v$session、v$process、v$mystat和v$statname视图的使用,提供了获取当前会话ID、查询会话统计信息以及连接查询以获取当前会话详细信息的方法。同时,介绍了如何通过这些信息进行SQL性能分析和跟踪,以优化数据库性能。

v$session,v$process,v$mystat,v$statname剖析

2012-09-27 14:39:52

分类: Oracle

我们经常要想获得跟踪文件的名称,而跟踪文件的名称包含了当前session的id,所以获得了当前session的id,也就可以找到当前跟踪文件的名称。而为了获得当前session的id,一般我们执行下面的SQL:
SQL> select spid from v$session s, v$process p, v$mystat m
        where s.paddr=p.addr and s.sid=m.sid and m.statistic#=0
;
SPID
------------
26156
或者:
SQL> select spid from v$session s inner join v$process p on s.paddr=p.addr
         inner join v$mystat m on s.sid=m.sid and m.statistic#=0
;
SPID
------------
26156
或者:
SQL> select spid from v$process where addr in (select paddr from v$session where
         sid=(select sid from v$mystat where rownum=1))

SPID
------------
26156

1)V$PROCESS
This view contains information about the currently active processes. While the LATCHWAIT column indicates what latch a process is waiting for, the LATCHSPIN column indicates what latch a process is spinning on. On multi-processor machines, Oracle processes will spin on a latch before waiting on it.
ColumnDatatypeDescription
ADDRRAW(4 | 8)Address of process state object
PIDNUMBEROracle process identifier
SPIDVARCHAR2(12)Operating system process identifier
USERNAMEVARCHAR2(15)Operating system process username. Any two-task user coming across the network has "-T" appended to the username.
SERIAL#NUMBERProcess serial number
TERMINALVARCHAR2(30)Operating system terminal identifier
PROGRAMVARCHAR2(48)Program in progress
TRACEIDVARCHAR2(255)Trace file identifier
BACKGROUNDVARCHAR2(1)1 for a background process; NULL for a normal process
LATCHWAITVARCHAR2(8)Address of latch the process is waiting for; NULL if none
LATCHSPINVARCHAR2(8)Address of the latch the process is spinning on; NULL if none
PGA_USED_MEMNUMBERPGA memory currently used by the process
PGA_ALLOC_MEMNUMBERPGA memory currently allocated by the process (including free PGA memory not yet released to the operating system by the server process)
PGA_FREEABLE_MEMNUMBERAllocated PGA memory which can be freed
PGA_MAX_MEMNUMBERMaximum PGA memory ever allocated by the process

2)V$MYSTAT

This view contains statistics on the current session.
ColumnDatatypeDescription
SIDNUMBERID of the current session
STATISTIC#NUMBERNumber of the statistic
VALUENUMBERValue of the statistic
v$mystat 是当前用户 session 的各种统计信息,sid就是session的id, STATISTIC# 是统计量的编号(用来唯一确定统计量的名称),value是统计量的值。v$mystat 中的 STATISTIC# 序号对应的含义可以从 v$statname 查询出来,STATISTIC#相当于编号,NAME就是统计量的名称。

3)V$STATNAME

This view displays decoded statistic names for the statistics shown in the V$SESSTAT and V$SYSSTAT tables.
On some platforms, the NAME and CLASS columns contain additional operating system-specific statistics.
ColumnDatatypeDescription
STATISTIC#NUMBERStatistic number

Note: Statistics numbers are not guaranteed to remain constant from one release to another. Therefore, you should rely on the statistics name rather than its number in your applications.

NAMEVARCHAR2(64)Statistic name
CLASSNUMBERA number representing one or more statistics classes. The following class numbers are additive:
  • 1 - User

  • 2 - Redo

  • 4 - Enqueue

  • 8 - Cache

  • 16 - OS

  • 32 - Real Application Clusters

  • 64 - SQL

  • 128 - Debug

STAT_IDNUMBERIdentifier of the statistic

SQL> column name for a35;
SQL> select * from v$statname where rownum<20;
STATISTIC# NAME                                     CLASS    STAT_ID
---------- ----------------------------------- ---------- ----------
         0 logons cumulative                            1 2666645286
         1 logons current                               1 3080465522
         2 opened cursors cumulative                    1   85052502
         3 opened cursors current                       1 2301954928
         4 user commits                                 1  582481098
         5 user rollbacks                               1 3671147913
         6 user calls                                   1 2882015696
         7 recursive calls                              1 2656001462
         8 recursive cpu usage                          1 4009879262
         9 session logical reads                        1 3143187968
        10 session stored procedure space               1  895486831
        11 CPU used when call started                 128  572264820
        12 CPU used by this session                     1   24469293
        13 DB time                                      1 3649082374
        14 cluster wait time                            1 2432034337
        15 concurrency wait time                        1 3868577743
        16 application wait time                        1 1099569955
        17 user I/O wait time                           1 3332107451
        18 session connect time                         1 1678473874

19 rows selected.
从上面的查询可以看出STATISTIC# =0 的含义是自实例启动以来用户登录数据库次数的累计值。其实在查询
select spid from v$session s inner join v$process p on s.paddr=p.addr
inner join v$mystat m on s.sid=m.sid and m.statistic#=0
; 中m.statistic#=1,2,3都可以,
只不过是为了得到唯一的 m.sid 而言。
另外:
通过连接查询v$mystat和v$statname就可以得到当前session的各种信息:
SQL> select m.*,n.name,n.class from v$mystat m inner join v$statname n on
        m.statistic#=n.statistic# where rownum<20;

       SID STATISTIC#      VALUE NAME                                     CLASS
---------- ---------- ---------- ----------------------------------- ----------
       147          0          1 logons cumulative                            1
       147          1          1 logons current                               1
       147          2        353 opened cursors cumulative                    1
       147          3         10 opened cursors current                       1
       147          4          0 user commits                                 1
       147          5          0 user rollbacks                               1
       147          6        389 user calls                                   1
       147          7       7155 recursive calls                              1
       147          8        152 recursive cpu usage                          1
       147          9       3818 session logical reads                        1
       147         10          0 session stored procedure space               1
       147         11        196 CPU used when call started                 128
       147         12        197 CPU used by this session                     1
       147         13        463 DB time                                      1
       147         14          0 cluster wait time                            1
       147         15          0 concurrency wait time                        1
       147         16          0 application wait time                        1
       147         17         71 user I/O wait time                           1
       147         18          0 session connect time                         1

19 rows selected.

4)V$SESSION
SQL> select count(column_name) from dba_tab_columns where table_name='V_$SESSION';
COUNT(COLUMN_NAME)
------------------
                76
我们看到v$session视图有76列,十分的复杂。我们稍微看一下比较重要的列。

This view lists session information for each current session.

ColumnDatatypeDescription
SADDRRAW(4 | 8)Session address
SIDNUMBERSession identifier
PADDRRAW(4 | 8)Address of the process that owns the session
USER#NUMBEROracle user identifier
USERNAMEVARCHAR2(30)Oracle username
TADDRVARCHAR2(8)Address of transaction state object
LOCKWAITVARCHAR2(8)Address of lock waiting for; null if none
......
STATUSVARCHAR2(8)Status of the session:
  • ACTIVE - Session currently executing SQL

  • INACTIVE

  • KILLED - Session marked to be killed

  • CACHED - Session temporarily cached for use by Oracle*XA

  • SNIPED - Session inactive, waiting on the client

SERVERVARCHAR2(9)Server type (DEDICATED| SHARED| PSEUDO| NONE)
SCHEMA#NUMBERSchema user identifier
SCHEMANAMEVARCHAR2(30)Schema user name
OSUSERVARCHAR2(30)Operating system client user name
PROCESSVARCHAR2(12)Operating system client process ID
MACHINEVARCHAR2(64)Operating system machine name
TERMINALVARCHAR2(30)Operating system terminal name
PROGRAMVARCHAR2(48)Operating system program name
TYPEVARCHAR2(10)Session type
SQL_ADDRESSRAW(4 | 8)Used with SQL_HASH_VALUE to identify the SQL statement that is currently being executed
SQL_HASH_VALUENUMBERUsed with SQL_ADDRESS to identify the SQL statement that is currently being executed
SQL_IDVARCHAR2(13)SQL identifier of the SQL statement that is currently being executed
SQL_CHILD_NUMBERNUMBERChild number of the SQL statement that is currently being executed
......
WAIT_CLASS_IDNUMBERIdentifier of the wait class
WAIT_CLASS#NUMBERNumber of the wait class
WAIT_CLASSVARCHAR2(64)Name of the wait class
WAIT_TIMENUMBERA nonzero value is the session's last wait time. A zero value means the session is currently waiting.
SECONDS_IN_WAITNUMBER 
STATEVARCHAR2(19)Wait state:
  • 0 - WAITING (the session is currently waiting)

  • -2 - WAITED UNKNOWN TIME (duration of last wait is unknown)

  • -1 - WAITED SHORT TIME (last wait <1/100th of a second)

  • >0 - WAITED KNOWN TIME (WAIT_TIME = duration of last wait)

SERVICE_NAMEVARCHAR2(64)Service name of the session
SQL_TRACEVARCHAR2(8)Indicates whether SQL tracing is enabled (ENABLED) or disabled (DISABLED)
SQL_TRACE_WAITSVARCHAR2(5)Indicates whether wait tracing is enabled (TRUE) or not (FALSE)
SQL_TRACE_BINDSVARCHAR2(5)Indicates whether bind tracing is enabled (TRUE) or not (FALSE)
<think>我们正在解决Oracle环境下“动态执行表不可访问,本会话的自动统计被禁用”的问题。根据引用内容,此问题是由于当前用户没有权限访问动态性能视图v$session, v$sesstat, v$statname等导致的。解决方法是以sysdba身份登录,然后授予这些视图的SELECT权限给普通用户。 步骤: 1. 使用具有SYSDBA权限的账户(如sys)登录到数据库。 2. 执行GRANT SELECT语句,将v$session, v$sesstat, v$statname以及v$mystat的SELECT权限授予目标用户(例如sczy_tj)。 注意:在授权时,视图名称大小写不敏感,但通常使用大写。另外,这些视图属于SYS用户,因此在授权时需要加上SYS.前缀(在某些情况下可能需要,但如果已经通过同义词访问则可以不加)。不过,根据Oracle的实践,通常直接使用视图名称(如v_$session)或通过同义词(v$session)访问。在授权时,我们通常使用同义词名。 但是,请注意:v$session实际上是v_$session的同义词,而v_$session是SYS用户下的视图。因此,在授权时,可以直接对v$session进行授权(因为同义词是公有的),但更严谨的做法是授权基础视图v_$session(或使用SYS.v_$session)。 然而,引用中给出的方法是直接对v$session、v$sesstat等视图进行授权。因此,我们按照引用中的方法操作。 具体操作如下(以用户sczy_tj为例): </think>### 解决动态性能表不可访问问题的方法 根据引用内容,您遇到的"动态执行表不可访问,本会话的自动统计被禁止"问题需要为普通用户授予特定动态性能视图的查询权限。以下是具体解决方案: #### 🔧 解决方法步骤 1. **使用管理员账户登录** 以 `SYSDBA` 身份连接数据库: ```sql CONNECT sys/<密码> AS SYSDBA ``` 2. **授予必要视图权限** 为目标账号(如 `sczy_tj`)授权: ```sql GRANT SELECT ON v$session TO sczy_tj; GRANT SELECT ON v$sesstat TO sczy_tj; GRANT SELECT ON v$statname TO sczy_tj; GRANT SELECT ON v$mystat TO sczy_tj; -- 附加相关视图[^3] ``` 3. **验证权限状态** 检查用户权限: ```sql SELECT * FROM dba_tab_privs WHERE grantee = 'SCZY_TJ' AND table_name IN ('V_$SESSION','V_$SESSTAT','V_$STATNAME'); ``` #### ⚠️ 关键注意事项 1. **权限范围** - `v$session` 等视图存储在 `SYS` 模式下,必须显式授权[^2] - 普通用户默认无权限访问动态性能视图 2. **错误预防** ```sql -- 若遇到"表或视图不存在"错误 GRANT SELECT ON sys.v_$session TO sczy_tj; -- 使用底层视图名 ``` 3. **权限回收方法**(如需撤销) ```sql REVOKE SELECT ON v$session FROM sczy_tj; REVOKE SELECT ON v$sesstat FROM sczy_tj; -- 同理撤销其他视图权限 ``` > **原理说明**:此问题是由于 Oracle 的安全机制限制普通用户访问性能监控视图导致的。通过显式授权后,PL/SQL Developer 等工具就能正常获取会话统计信息[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值