动态性能视图
来源:互联网 发布:python 3.x运算符 编辑:程序博客网 时间:2024/06/10 11:56
http://blog.sina.com.cn/s/blog_4949b37101000a7y.html 《==原文
v$session + v$session_wait (在10g里功能被整合,凑合算1个吧.)
v$process
v$sql
v$sqltext
v$bh (更宁愿是x$bh)
v$lock
v$latch_children
v$sysstat
v$system_event
上边是eygle大师提到的认为最终要的9个视图,我觉得确实有必要进行总结一下了.
1)关于sql的动态视图:
内容:
v$sql,v$sqlarea,v$sqltext 都是关于运行的sql的信息,都是通过address ,hash_value两个列来确定一个sql,v$sql和v$sqlarea反映的信息较之v$sqltext更具体,但是V$sqltext能查到SQL语句的全部(将一个SQL分为多条记录,每条记录64字节,通过HASH VALUE来判断是否属于一条SQL),但v$sql,v$sqlarea只显示1000字节。所以要访问V$SQLTEXT最好根据piece去排序,来组织正确的SQL。
v$sqlarea 共享池中存储的sql和一些相关的信息,如累计的执行次数(executions),逻辑读(buffer_gets),物理读(disk_reads)等统计信息。 但v$SQLAREA 忽略了 执行计划 等差异,只是在形式上sql文本看起来一样!相当于做了个聚合,是多个不同执行计划的sql的聚合和累计信息
v$sql具有更细致的信息包括执行计划,对象等,实际上,v$sqlarea 可以看做 v$sql 根据 sqltext 等 做了 group by 之后的信息,因为这个group by的存在,在非常繁忙的系统中,查询v$sqlarea可能是非常缓慢而危险的.
常用语句:
SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls
耗费资源进程运行的sql:
v$sqlarea,v$session,v$process
where v$session.sql_address= v$sqlarea.address
and v$session.paddr=v$process.addr
and v$session.sql_hash_value=v$sqlarea.hash_value
and v$process.spid in (433435);//这里就是用address和hash_value来确定的唯一sql
2)关于session的动态视图:
a.
v$session:显示当前正在连接的session信息。
sid 和serial#字段:标识唯一session,用sqlplus连接后,如果再进行conn,则serial#加2,而sid不变,如果将此session kill,session的status变为killed状态,在v$session中此session信息仍然存在,再在此sqlplus下操作则警告session已被killed,同时此session在v$session中消失,但如果再conn则抱错ORA-24313: 用户已获得证明
paddr 字段:系统进程地址,通过它可以与v$process(addr字段)相关关联检查进程信息。
ROW_WAIT_OBJ#字段:通过这个字段可以与dba_objects(object_id)相关联找出被锁对象。
sql_address,sql_hash_value字段:通过这两个字段可以查找详细的sql语句,与v$sqlarea的address ,hash_value相对应。
b.
v$session_longops :显示长时间运行ddl,dml语句信息。
下面的脚本将显示一个状态信息,说明了运行时间很长的DDL操作已经使用的时间
Select sid, message
From v$session_longops
Where sid = &sid
order by start_time;
运行的最多的:
select sql_hash_value,count(*) from v$session_longops group by (sql_hash_value);
c.
v$process: 操作系统进程信息。
spid字段是操作系统进程号,可以用来进行 kill -9 spid 这么一个操作。
select sql_text
from v$sqltext_with_newlines st,v$session se
where st.address=se.sql_address and st.hash_value=se.sql_hash_value
and se.sid =&wait_sid order by piece;
3)关统计的:
a.
v$sysstat:系统统计。
statistic#(统计号码) name(统计名)class统计类别包括1(用户)2(重做)4(队列)8(缓存)16(操作系统)32(并行服务器064(sql)128(调试) value(统计值)
buffer hit ratio:
select a.value + b.value "logical_reads",
c.value "phys_reads",
round(100 * ((a.value + b.value) - c.value) / (a.value + b.value)) "BUFFER HIT RATIO"
from v$sysstat a, v$sysstat b, v$sysstat c
where a.name = 'db block gets'
and b.name = 'consistent gets'
and c.name = 'physical reads';
b.
v$sesstat –-每个会话的统计信息。
根据session id可以得到这个session的统计信息:
select a.name,b.value
from v$statname a,v$sesstat b
where a.STATISTIC#=b.STATISTIC#
and b.sid=&sid
and b.value <>0
order by b.value;
4)关于等待事件:
a.
v$system_event:系统级等待事件,系统启动以来在所有会话中发生过的情况。
event:列出所有发生的事件的名称。最常见的:
latch_waits,db file scattered read,db file sequential read,enqueue wait,buffer busy wait,log file parallel write,free buffer waits等。
total_waits:等待次数。
total_timeouts:超时次数。
time_waited:等待时间。以厘秒为单位1%秒。
b.
v$session_event:每个会话对每个事件的等待情况,所以只是比v$system_event多个sid字段。这个视图在判断一个会话正在等待什么资源的时候非常有用。
c.
v$session_wait :当前正处于连接状态的会话的等待事件,这个视图与上面两个不同,没有存储统计信息,而是提供了当前已经发生或正在发生的事件的可用信息。。
sid字段:通过此字段与v$session(sid)关联找出相关等待事件,同v$session_event中的id一样。
如果是非空闲等待事件,通过等待会话的sid可以求出该会话在执行的sql
seq#:会话内部顺序号。
event:事件名称。
P[1-3]:这三个参数用来提供关于等待事件更为详细的信息。
p1代表了文件编号,可以与v$filestat或dba_data_file相关联。
p2代表了锁存器编号,可以与v$latch关联查询。
p3代表了数据块编号,可以与dba_extents,sys.uet$联合查询。
state:该字段有4种含义:
wait_time:只有在state值为waited known time时有效。单位秒。
seconds_in_wait:只有在state值为waiting时有效。
记录在v$session_wait的统计信息意义不大,因为这里面的数据是实时变化的,在v$session_wait的等待事件结束后,v$session_event的统计信息将发生变化,最近发生的等待信息将增加到原有的统计信息中去。
5)关于锁:
a.
v$lock:列出当前系统持有的或正在申请的所有锁的情况。
sid:会话标识。
type:锁类型。TM(表级锁),TX(事务锁,行级锁)。
id1,id2:锁标识.type=tm时,id1表示object_id,id2=0,type=tx时,id1相当于记录号.
lmode:锁模式.0(None),1(null),2(row share),3(row exclusive),4(share),5(share row exclusive),6(exclusive);
request:申请的锁模式,值同上.
ctime:已持有或等待锁的时间.
block:是否阻塞其他锁申请.被阻塞的锁也可以在request上看出.
b.
v$locked_object:列出当前系统中那些对象正被锁定.
object_id:被锁的对象id.
session_id:会话id.
oracle_username:oracle用户名.
os_user_name:操作系统用户名.
process:操作系统进程号.跟v$process的spid不同.
locked_mode:锁模式.
显示哪些对象被锁:
select rpad(oracle_username,10) o_name,session_id sid,
decode(locked_mode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exculsive',6,'Exculsive') lock_type,object_name,xidusn,xidslot,xidsqn
from v$locked_object,all_objects
where v$locked_object.object_id=all_objects.object_id;
显示TM,TX锁信息,并按ctime排序:
SELECT