动态性能视图

来源:互联网 发布: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
  FROM V$SQLAREA
  WHERE buffer_gets > 10000000
 OR disk_reads > 1000000
  ORDER BY buffer_gets + 100*disk_reads DESC
耗费资源进程运行的sql:
 select sql_text,spid,v$session.program,process from
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: 用户已获得证明  (使用as sysdba时),无法在连接,除非退出sqlplus重新登陆,重新登陆后sid不变,serial#增加。这个实验也表明kill session 并不会释放进程占用的资源。

paddr 字段:系统进程地址,通过它可以与v$process(addr字段)相关关联检查进程信息。

 lockwait字段:可以通过这个字段查询出当前正在等待的锁的相关信息.通过v$lock的kaddr 相关联的到更多信息。

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种含义:
    waiting:会话正在等待这个事件。
    waited unknown time:由于timed_statistics为false,而导致不能得到时间信息。
    waited short time:等待的时间非常短。
    waited known time: 一旦会话等待的资源得到,将从waiting转到此状态。
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   TYPE || '-' || id1 || '-' || id2 "resource", SID,
         DECODE (lmode,
                 0, 'None',
                 1, 'Null',
                 2, 'Row share',
                 3, 'Row Exclusive',
                 4, 'Share',
                 5, 'Share Row Exculsive',
                 6, 'Exculsive'
                ) lock_type,
         DECODE (lmode,
                 0, 'None',
                 1, 'Null',
                 2, 'Row share',
                 3, 'Row Exclusive',
                 4, 'Share',
                 5, 'Share Row Exculsive',
                 6, 'Exculsive'
                ) request,
         ctime, BLOCK
    FROM v$lock
   WHERE TYPE IN ('TX', 'TM')
ORDER BY "resource", ctime DESC;
简单解决锁问题:
select * from v$locked_object
select * from all_objects where object_id=31427
select * from v$sqlarea where sql_text like '%test4%'

6)关于latch:
V$LATCH :每一行包含一中类型latch的统计信息.
V$LATCHHOLDER :拥有latch的进程信息.
V$LATCHNAME :每个latch号所表示的latch名.
显示系统的latch信息:
select c.name,a.addr,a.gets,a.misses,a.sleeps,
a.immediate_gets,a.immediate_misses,b.pid
from v$latch a, v$latchholder b, v$latchname c
where a.addr = b.laddr(+)
and a.latch# = c.latch#
order by a.latch#;

7)关于缓存区:
v$bh:可以查询 buffer cache中缓存的数据块,其中包括脏数据块以及为读一致性构造的cr 块,可以知道哪些对象正在消耗数据缓冲区。
file# :文件号;
block#:数据块号。
class#:class号。
status:缓冲区状态,主要的有:free:当前未被使用.xcur:exclusive特定的block针对特定的进程而言的。
.scur:shared current;cr:一致性读.read:正在读.mrec:介质恢复模式.irec:instance恢复模式.dirty:是否赃块.
objd:对象号.
ts#:表空间号.
某对象在缓冲中的块数:
 select count(*) from v$bh
where objd=31427 and status <>'free'
清空缓冲:
alter system flush buffer_cache;//10g新特性
alter session set events = 'immediate trace name flush_cache';
alter system set events = 'immediate trace name flush_cache';我们注意到flush_cache以后,所有Buffer都被标记为free,而不是真的清空了.
显示缓冲区中的对象的名字:
select owner, object_name
from dba_objects o,v$bh bh
where o.DATA_OBJECT_ID  = bh.objd
and bh.status <>'free'
and o.owner like '%DORM%';

 

0 0
原创粉丝点击