在定位性能问题的时候,第一步需要做的事情通常是查看一些动态视图来获得一些相关的信息。这些视图比SQL_TRACE或者AWR报告更方便和快捷。
v$mystat记录了某个session从运行以来的各种资源统计数据。
1、v$mystat视图中只会有当前用户的会话信息,v$sesstat会有整个实例内所有会话信息。两个视图结构一致,只是统计数据不一致。
2、一般情况下v$mystat,v$sesstat会与v$statname一起配合使用。在v$statname视图中STATISTIC#与v$mystat,v$sesstat中STATISTIC#字段是相关联的。而NAME则是对应的英文信息:
select a.sid,b.name,a.value from v$sesstat a,v$statname b where a.sid=192 and a.statistic#=b.statistic# and b.name in ('consistent gets','physical reads','parse count (total)','parse count (hard)');
3、如果是sys或system用户或是有dba权限的用户,可以直接查询v$mystat即可得到sid;如果是普通用户的话,执行下列sql:
select sys_context('USERENV','SESSIONID') from dual;
得到的是v$session中的AUDSID字段中的值。然后根据v$session 查询即可。
select sid,serial#,username,process from v$session where audsid=261290;
v$session 记录每一个连接到数据库实例中的 session。包括用户 session及后台进程如 DBWR, LGWR, archiver等等。
SID: SESSION标识,常用于连接其它列
SERIAL#:如果某个 SID又被其它的 session使用的话则此数值自增加 (当一个SESSION结束,另一个 SESSION开始并使用了同一个 SID)。
USERNAME:当前 session在 oracle中的用户名。
last_call_et:sql语句运行的时间。如果session状态为active,那么意味着从session变为active到现在的时间,如果session状态为inactive,则意味着从session状态变为inactive到现在的时间。
event:当前等待的事件。
查找你的 session信息:
SELECT SID, OSUSER, USERNAME, MACHINE,PROGRAM,state, PROCESS FROM V$SESSION;
查找当前被某个指定 session正在运行的 sql语句:
select b.sql_text,a.status,a.last_call_et,a.event from v$session a,v$sqlarea b where a.sql_id=b. sql_id and a.sid= 100;
v$sql视图列举了共享SQL区(Shared SQL Area)中的SQL统计信息,这个视图中的信息未分组,每个SQL指针都包含一条独立的记录。这个视图的主要字段如下:
select sql_text,executions,disk_reads,optimizer_mode,buffer_gets,hash_value from v$sql where sql_text like'select * from emp%';
1、disk_reads和buffer_gets分别对应执行计划当中的physical reads和consistent gets。
2、如果重复执行sql_text,disk_reads不再增加,而BUFFER_GETS和执行次数继续增加。
select sql_text,cpu_time/(1000*1000) t_cpu,trunc(elapsed_time/(1000*1000)) t_elap,(cpu_time/elapsed_time/(1000*1000))*100 pct
from v$sql where sql_text like 'insert into t_%';
对比sql语句消耗的cpu时间和执行的时间,就可以知道sql语句在执行中是否有长时间的等待事件。
select sql_text,parse_calls,executions from v$sql where sql_text like 'select * from t%';
parse_calls代表sql被分析的次数,EXECUTIONS代表sql被执行的次数,对分析sql是否绑定变量非常有用。
v$sqlarea列出了共享SQL区(Shared SQL Area)中的SQL统计信息,这些SQL按照SQL文本的不同,每条会记录一行统计数据。注意这里所说的是“按照SQL文本”来进行区分,也就是说这个视图的信息可以看作是根据SQL_TEXT进行的一次汇总统计。
select sql_text,executions,disk_reads,buffer_gets,hash_value,version_count from v$sqlarea where sql_text like 'select count(*) from t%';
1、Oracle将v$sql中的sql_text相同的子指针合并起来,执行次数等信息也都进行了累计,这就是v$sqlarea的聚合作用。
2、看起来完全相同的一句SQL ,往往具有不同的执行计划。如果是不同的数据库用户,那么相应的涉及的对象可能都不一样。即使是相同的数据库用户,若 session 的优化模式、session 级的参数 等不一样,执行计划也能不同。所以即使相同的sql,也可能具有不同的执行计划!
3、因v$sql及v$sqlarea存放着统计信息在调优时使用居多,但其sql_text是不全的,如果想获得完整的sql就要用v$sqltext了。
select * from v$sqltext where hash_value='3111103299' order by piece(HASH_VALUE和ADDRESS用来鉴别SQL语句)
v$sql_shared_cursor存放了sql在执行过程中游标共享的信息,可以用来分析为什么看上去同样的sql语句却没有共享的原因。
select parsing_user_id puid,parsing_schema_id psid,sql_text,sql_id,address,hash_value,child_address from v$sql where sql_text like 'INSERT INTO T VALUES%';
根据SQL_ID查询对应的游标不能共享的原因:
SELECT * FROM V$SQL_TXWHERE SQL_ID='cv6dqthna0m96';
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26770925/viewspace-1291858/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26770925/viewspace-1291858/