Oracle10g中如何分析响应时间
User I/O 5748 61.71 67.57 65.79
Other 182 1.95 16.85 16.41
System I/O 2975 31.94 11.27 10.97
Concurrency 114 1.22 6.76 6.58
Commit 61 0.65 0.22 0.21
Network 233 2.5 0.03 0.03
Application 2 0.02 0 0
这样就能非常容易的找出大部分的整体等待时间。如同响应时间数据一样,我们可以用下面的查询来及时回顾最新的一个小时等待类型:
select a.sid,
b.username,
a.wait_class,
a.total_waits,
round((a.time_waited / 100),2) time_waited_secs
from sys.v_$session_wait_class a,
sys.v_$session b
where b.sid = a.sid and
b.username is not null and
a.wait_class != 'Idle'
order by 5 desc;
SID USERNAME WAIT_CLASS TOTAL_WAITS TIME_WAITED_SECS
----- -------------- -------------- ----------- ----------------
38 SYS User I/O 22 0.19
48 SYS User I/O 15 0.12
38 SYS Network 21 0.01
48 SYS Network 24 0
38 SYS Application 2 0
这个时候,就可以检查标准的单独等待事件就如在以前版本的Oracle数据库中查询V$SESSION_WAIT和V$SESSION_EVENT视图。在Oracle10g数据库中DBA还将可以找出新的等待类型在这两张视图中。
如果需要找出以前哪个会话登录并且消耗了大部分的资源,你可以使用下面的查询,下面的例子是查找午夜12点到5点的数据库活动,并且包括用户的I/O等待。
select sess_id,
username,
program,
wait_event,
sess_time,
round(100 * (sess_time / total_time),2) pct_time_waited
from
(select a.session_id sess_id,
decode(session_type,'background',session_type,c.username) username,
a.program program,
b.name wait_event,
sum(a.time_waited) sess_time
from sys.v_$active_session_history a,
sys.v_$event_name b,
sys.dba_users c
where a.event# = b.event# and
a.user_id = c.user_id and
sample_time > '22-JAN-07 12:00:00 AM' and
sample_time < '22-JAN-07 05:00:00 AM' and
b.wait_class = 'User I/O'
group by a.session_id,
decode(session_type,'background',session_type,c.username),
a.program,
b.name),
SQL语句响应时间分析:
在Oracle9i数据库中查看SQL语句的响应时间就变得比较容易了,现在在Oracle10g中,DBA们拥有更多的工具可以帮助他们跟踪效率低下的数据库代码。以前可以用来查询的视图是V$SQLAREA,从Oracle9i开始,这个视图增加了ELAPSED_TIME和CPU_TIME两个列,这极大的有助于去确定实际用户的SQL语句的执行经历。(如果除以执行的次数列EXECUTIONS,那么将得到平均每次执行这个SQL语句所用的平均时间)在Oracle10g数据库中,V$SQLAREA视图中增加了6个新的和等待以及时间相关的列:
l APPLICATION_WAIT_TIME
l CONCURRENCY_WAIT_TIME
l CLUSTER_WAIT_TIME
l USER_IO_WAIT_TIME
l PLSQL_EXEC_TIME
l JAVA_EXEC_TIME
这些新的列有助于确定很多信息,例如:一个存储过程中花费在PL/SQL代码和标准SQL执行上的时间的对比,以及一个SQL语句经历的任何详细的用户I/O等待。例如:下面的SQL语句能帮助找到前5位用户I/O等待最高的SQL语句:
select * from
(select sql_text,
sql_id,
elapsed_time,
cpu_time,
user_io_wait_time
from sys.v_$sqlarea
order by 5 desc)
where rownum < 6;
SQL_TEXT SQL_ID ELAPSED_TIME CPU_TIME USER_IO_WAIT_TIME
-------------------------------------------------------------------------------- ------------- ------------ ---------- -----------------
DECLARE job BINARY_INTEGER := :job; next_date DATE := :mydate; broken BOOLEAN : 6gvch1xu9ca3g 11077912 747091 8593479
select /*+ index(idl_ub1$ i_idl_ub11) +*/ piece#,length,piece from idl_ub1$ wher cvn54b7yz0s8u 6455976 220128 6427409
select s.synonym_name object_name, o.object_type from sys.all_synonyms s, s fqmpmkfr6pqyk 11814078 6958760 3189450
select /*+ rule */ bucket, endpoint, col#, epvalue from histgrm$ where obj#=:1 a db78fxqxwxt7r 2737680 193937 2689611
select /*+ index(idl_ub2$ i_idl_ub21) +*/ piece#,length,piece from idl_ub2$ wher 39m4sx9k63ba2 2322664 108100 2307700
当然,获取最消耗时间或者等待时间最长的SQL语句非常不错,但是同时也需要抓住其要点——在V$ACTIVE_SESSION_HISTORY视图中又一次出现的SQL语句。通过这个视图,能够找出具体什么等待时间延迟了SQL语句执行,连同实际的文件,对象以及阻塞的对象导致等待。
例如:设想已经找到一个特别的SQL语句,看上去在用户I/O等待时间方面极端的严重,那么可以执行下面的查询来得到等待时间中各个单独的等待事件,等待的文件,等待的对象:
select event,
time_waited,
owner,
object_name,
current_file#,
current_block#
from sys.v_$active_session_history a,
sys.dba_objects b
where sql_id = '6gvch1xu9ca3g' and
a.current_obj# = b.object_id and
time_waited <> 0;
EVENT TIME_WAITED OWNER OBJECT_NAME file block
------------------------- ----------- ------ --------------------- ---- ------
db file sequential read 27665 SYSMAN MGMT_METRICS_1HOUR_PK 3 29438
db file sequential read 3985 SYSMAN SEVERITY_PRIMARY_KEY 3 52877
当然,也可以通过使用V$ACTIVE_SESSION_HISTORY视图中的历史数据的方式来限制一段特殊时间内的没有优化的SQL语句。问题在于Oracle10g数据库通过简化的数据字典视图把SQL语句的响应时间分析变得非常的简单,比起以前运用消耗时间的trace方法来说。
总结:
DBA们和性能分析专家们管理Oracle10g数据库的性能时会发现在最新的Oracle旗舰数据库中已经把许多的响应时间数据做成了动态性能视图。这些统计信息将有助于迅速找出大型复杂数据库中的性能瓶颈所在。
想自己动手组装电脑吗?想了解市场行情吗?来技术无忧DIY资讯一切烦脑都没有!











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面