Oracle10g数据库中如何分析响应时间
博客分类:
Oracle
OracleSQL
Oracle10g数据库中如何分析响应时间
在Oracle10g中,以前版本中比较难于获取的响应时间数据将会变得非常容易
在以前看来,为了尽量获得数据库的最佳性能,Oracle的DBA们和性能分析
困难获得系统以及用户会话活动的一致的响应时间数据。DBA们面临的问题一直以
方面:第一个方面是准确定位数据库或者用户会话究竟在哪里消耗了时间;第二个
确定用户体验的客观性质。
在数据库中产生所有可能的行为和交互作用,这些任务都不是没有价值的。O
接口,在之前的很早的Oracle数据库版本中开始介绍的,对于那些知道如何使用
管理员来说这已经成为一个伟大的开始,即使它仍然缺乏告诉DBA系统或者用户会
效的处理了事务或者查询这个理想的能力。启用和钻研跟踪文件能够存储这个级别
信息,但是对于大多数超负荷工作管理大型数据库的DBA们,这个钻研是奢侈的而
的。
幸运的是,那些将数据库升级到Oracle10g的DBA们将会发现找到主要的响应
很容易,可以允许一个非常好的图表来显示系统和会话级的响应时间数据。很重要
Oracle的ADDM提供了一个查看响应时间的方法,通过自动分析收集的统计信息,
域,甚至可以通过Oracle企业管理器网络控制的图形界面提供建议。
此外,与我们这里讨论相关的是Oracle10g数据库的历史数据机制允许DBA们
对响应时间趋势的分析,这将有助于DBA们确定事务/系统的高峰时期,更好的定
批处理周期和ETL作业的进程和SQL语句。
这里主要讨论用于系统、会话和SQL级别上那些历史机制的用途。
系统层的响应时间分析:
先来看看典型的几个经常问到DBA们的问题:
通常来说,数据库运行的状况如何?
用户体验感觉的平均响应时间是多少?
什么行为是最影响整个响应时间的?
上述问题在Oracle10g数据库之前对于DBA们来说是相当不好回答的,但是如果使用了
最新的Oracle10g数据库之后,这些数据信息将会很容易的被捕获到。
首先,Oracle10g数据库运行的状况如何这个问题可以通过下面的查询来获得:
lectMETRIC_NAME,VALUE
fromSYS.V_$SYSMETRIC
whereMETRIC_NAMEIN('DatabaCPUTime
Ratio','DatabaWaitTimeRatio')
ANDINTSIZE_CSEC=(lectmax(INTSIZE_CSEC)
fromSYS.V_$SYSMETRIC);
METRIC_NAMEVALUE
DatabaWaitTimeRatio31.3499111
DatabaCPUTimeRatio68.6500888
Oracle10g数据库中的V$SYSMETRIC视图中存在一些非常有用的响应时间数据,其中两个
比较重要的就是WaitTimeRatio和DatabaCPUTimeRatio.上面的查询显示了数据库中
最新的关于这两个统计数据的快照,这将有助于帮助我们确定是否数据库正在经历着一个比
较高的等待百分率和瓶颈。数据库的CPUTimeRatio是由数据库中的"databatime"的数
值除以CPU的数量,"databatime"定义为数据库消耗在用户级别调用所花费的时间(不包
括实例的后台进程活动所消耗的时间)。比较高的值(90%-95%以上)代表很少等待和瓶颈活
动,因为各个系统不同,这个阀值只能作为一个一般的规则来使用。
还可以使用如下的查询来迅速查看最新一个小时的信息,看看数据库的总性能如何:
lectend_time,value
fromsys.v_$sysmetric_history
wheremetric_name='DatabaCPUTimeRatio'
orderby1;
END_TIMEVALUE
2007-1-2423.21949216
2007-1-2423.01443414
2007-1-2429.75636353
2007-1-2429.28581409
2007-1-24243.3490481
2007-1-24238.8366361
2007-1-24232.0272511
2007-1-2420
2007-1-24222.9580733
2007-1-24233.0615102
2007-1-24243.1294933
可以从V$SYSMETRIC_SUMMARY视图中获得数据库整体性能效率的最大、最小和平均值:
lectCASEMETRIC_NAME
WHEN'SQLServiceResponTime'then'SQL
ServiceResponTime(cs)'
WHEN'ResponTimePerTxn'then'ResponTime
PerTxn(cs)'
ELSEMETRIC_NAME
ENDMETRIC_NAME,
CASEMETRIC_NAME
WHEN'SQLServiceResponTime'thenROUND
((MINVAL/100),2)
WHEN'ResponTimePerTxn'thenROUND((MINVAL
/100),2)
ELSEMINVAL
ENDMININUM,
CASEMETRIC_NAME
WHEN'SQLServiceResponTime'thenROUND
((MAXVAL/100),2)
WHEN'ResponTimePerTxn'thenROUND((MAXVAL
/100),2)
ELSEMAXVAL
ENDMAXIMUM,
CASEMETRIC_NAME
WHEN'SQLServiceResponTime'thenROUND
((AVERAGE/100),2)
WHEN'ResponTimePerTxn'thenROUND((AVERAGE
/100),2)
ELSEAVERAGE
ENDAVERAGE
fromSYS.V_$SYSMETRIC_SUMMARY
whereMETRIC_NAMEin('CPUUsagePerSec',
'CPUUsagePerTxn',
'DatabaCPUTimeRatio',
'DatabaWaitTimeRatio',
'ExecutionsPerSec',
'ExecutionsPerTxn',
'ResponTimePerTxn',
'SQLServiceResponTime',
'UrTransactionPerSec')
ORDERBY1;
METRIC_NAMEMININUMMAXIMUMAVERAGE
CPUUsagePerSec053.994757711.1603280
CPUUsagePerTxn0168.73166624.8848615
DatabaCPUTimeRatio087.186629535.8114730
DatabaWaitTimeRatio090.714185964.1885269
ExecutionsPerSec0540.768348114.852472
ExecutionsPerTxn01911279.912779
ResponTimePerTxn(cs)03.880.66
SQLServiceResponTime(cs)000
UrTransactionPerSec04.701834860.94469007
上面的查询包含了更多的详细的响应时间数据。DBA们还需要收集在系统级别
讯的平均响应时间,上面的查询给出了需要的结果。如果用户抱怨响应时间太慢,
就应该查看ResponTimePerTxn和SQLServiceResponTime数据是否存在
题。
如果响应时间不在是那么渴求,那么DBA就会想了解究竟是什么类型的用户活
库的响应变得如此的慢,在Oracle10g数据库之前,这些信息是比较难获取的,
变得非常容易,执行如下查询:
lectcadb_stat_name
when'partimeelapd'then
'softpartime'
eldb_stat_name
enddb_stat_name,
cadb_stat_name
when'sqlexecuteelapdtime'then
time_cs-plsql_time
when'partimeelapd'then
time_cs-hard_par_time
eltime_cs
endtime_cs,
cadb_stat_name
when'sqlexecuteelapdtime'then
round(100*(time_cs-plsql_time)/db_time,
2)
when'partimeelapd'then
round(100*(time_cs-hard_par_time)/
db_time,2)
elround(100*time_cs/db_time,2)
endpct_time
from
(lectstat_namedb_stat_name,
round((value/1000000),3)time_cs
fromsys.v_$sys_time_model
wherestat_namenotin('DBtime','background
elapdtime',
'backgroundcputime','DBCPU')),
(lectround((value/1000000),3)db_time
fromsys.v_$sys_time_model
wherestat_name='DBtime'),
(lectround((value/1000000),3)plsql_time
fromsys.v_$sys_time_model
wherestat_name='PL/SQLexecutionelapd
time'),
(lectround((value/1000000),3)
hard_par_time
fromsys.v_$sys_time_model
wherestat_name='hardparelapdtime')
orderby2desc;
DB_STAT_NAMETIME_SECSPCT_TIME
sqlexecuteelapdtime65.64489.7
hardparelapdtime26.66136.43
PL/SQLexecutionelapdtime12.76617.44
PL/SQLcompilationelapdtime6.3538.68
softpartime2.152.94
connectionmanagementcallelapdtime1.084
1.48
hardpar(sharingcriteria)elapdtime
0.4480.61
repeatedbindelapdtime0.0260.04
failedparelapdtime0.0090.01
hardpar(bindmismatch)elapdtime0.002
0
RMANcputime(backup/restore)00
inboundPL/SQLrpcelapdtime00
quenceloadelapdtime00
Javaexecutionelapdtime00
failedpar(outofsharedmemory)elapd
time00
可以在V$SYS_TIME_MODEL视图中找到相应的主要花费时间处理的部分,然后就可以根据
这些来对数据库进行相应的调整。
除了活动时间,DBA也还想知道整体的等待时间。在Oracle10g数据库之前,DBA必须查
看单独的等待事件来找出等待和瓶颈,现在Oracle10g数据库提供一个等待的概要机制。
lectWAIT_CLASS,
TOTAL_WAITS,
round(100*(TOTAL_WAITS/SUM_WAITS),2)
PCT_WAITS,
ROUND((TIME_WAITED/100),2)TIME_WAITED_SECS,
round(100*(TIME_WAITED/SUM_TIME),2)
PCT_TIME
from
(lectWAIT_CLASS,
TOTAL_WAITS,
TIME_WAITED
fromV$SYSTEM_WAIT_CLASS
whereWAIT_CLASS!='Idle'),
(lectsum(TOTAL_WAITS)SUM_WAITS,
sum(TIME_WAITED)SUM_TIME
fromV$SYSTEM_WAIT_CLASS
whereWAIT_CLASS!='Idle')
orderby5desc;
WAIT_CLASSTOTAL_WAITSPCT_WAITS
TIME_WAITED_SECSPCT_TIME
UrI/O574861.7167.5765.79
Other1821.9516.8516.41
SystemI/O297531.9411.2710.97
Concurrency1141.226.766.58
Commit610.650.220.21
Network2332.50.030.03
Application20.0200
这样就能非常容易的找出大部分的整体等待时间。如同响应时间数据一样,我们可以用
下面的查询来及时回顾最新的一个小时等待类型:
,
me,
_class,
_waits,
round((_waited/100),2)
time_waited_cs
fromsys.v_$ssion_wait_classa,
sys.v_$ssionb
=
meisnotnulland
_class!='Idle'
orderby5desc;
SIDUSERNAMEWAIT_CLASSTOTAL_WAITS
TIME_WAITED_SECS
38SYSUrI/O220.19
48SYSUrI/O150.12
38SYSNetwork210.01
48SYSNetwork240
38SYSApplication20
这个时候,就可以检查标准的单独等待事件就如在以前版本的Oracle数据库中查询
V$SESSION_WAIT和V$SESSION_EVENT视图。在Oracle10g数据库中DBA还将可以找出新的等
待类型在这两张视图中。如果需要找出以前哪个会话登录并且消耗了大部分的资源,你可以
使用下面的查询,下面的例子是查找午夜12点到5点的数据库活动,并且包括用户的I/O等
待。
lectss_id,
urname,
program,
wait_event,
ss_time,
round(100*(ss_time/total_time),2)
pct_time_waited
from
(n_idss_id,
decode(ssion_type,'background',
ssion_type,me)urname,
mprogram,
it_event,
sum(_waited)ss_time
fromsys.v_$active_ssion_historya,
sys.v_$event_nameb,
_ursc
#=#and
_id=_idand
sample_time>'22-JAN-0712:00:00AM'and
sample_time<'22-JAN-0705:00:00AM'and
_class='UrI/O'
n_id,
decode(ssion_type,'background',
ssion_type,me),
m,
),
SQL语句响应时间分析
在Oracle9i数据库中查看SQL语句的响应时间就变得比较容易了,现在在
Oracle10g中,DBA们拥有更多的工具可以帮助他们跟踪效率低下的数据库代
码。以前可以用来查询的视图是V$SQLAREA,从Oracle9i开始,这个视图增加
了ELAPSED_TIME和CPU_TIME两个列,这极大的有助于去确定实际用户的SQL
语句的执行经历。(如果除以执行的次数列EXECUTIONS,那么将得到平均每次
执行这个SQL语句所用的平均时间)在Oracle10g数据库中,V$SQLAREA视图
中增加了6个新的和等待以及时间相关的列:
APPLICATION_WAIT_TIME
CONCURRENCY_WAIT_TIME
CLUSTER_WAIT_TIME
USER_IO_WAIT_TIME
PLSQL_EXEC_TIME
JAVA_EXEC_TIME
这些新的列有助于确定很多信息,例如:一个存储过程中花费在PL/SQL代
码和标准SQL执行上的时间的对比,以及一个SQL语句经历的任何详细的用户
I/O等待。例如:下面的SQL语句能帮助找到前5位用户I/O等待最高的SQL
语句:
lect*from
(lectsql_text,
sql_id,
elapd_time,
cpu_time,
ur_io_wait_time
fromsys.v_$sqlarea
orderby5desc)
whererownum<6;
SQL_TEXTSQL_IDELAPSED_TIMECPU_TIME
USER_IO_WAIT_TIME
DECLAREjobBINARY_INTEGER:=:job;
next_dateDATE:=:mydate;brokenBOOLEAN:
6gvch1xu9ca3g118593479
lect/*+index(idl_ub1$i_idl_ub11)+*/
piece#,
length,piecefromidl_ub1
$whercvn54b7yz0s8u645597622
m_nameobject_name,
__synonymss,
sfqmpmkfr6pqyk1181489450
lect/*+rule*/bucket,endpoint,col#,
epvaluefromhistgrm$whereobj#=:1a
db78fxqxwxt7r
27376811
lect/*+index(idl_ub2$i_idl_ub21)+*/
piece#,
length,piecefromidl_ub2$
where39m4sx9k63ba223226641
当然,获取最消耗时间或者等待时间最长的SQL语句非常不错,但是同时
也需要抓住其要点——在V$ACTIVE_SESSION_HISTORY视图中又一次出现的SQL
语句。通过这个视图,能够找出具体什么等待时间延迟了SQL语句执行,连同
实际的文件,对象以及阻塞的对象导致等待。
例如:设想已经找到一个特别的SQL语句,看上去在用户I/O等待时间方
面极端的严重,那么可以执行下面的查询来得到等待时间中各个单独的等待事
件,等待的文件,等待的对象:
lectevent,
time_waited,
owner,
object_name,
current_file#,
current_block
#fromsys.v_$active_ssion_historya,
_objectsb
wheresql_id='6gvch1xu9ca3g'and
t_obj#=_idand
time_waited<>0;
EVENTTIME_WAITEDOWNEROBJECT_NAMEfileblock
dbfilequentialread27665SYSMAN
MGMT_METRICS_1HOUR_PK329438
dbfilequentialread3985SYSMAN
SEVERITY_PRIMARY_KEY352877
当然,也可以通过使用V$ACTIVE_SESSION_HISTORY视图中的历史数据的方
式来限制一段特殊时间内的没有优化的SQL语句。问题在于Oracle10g数据库
通过简化的数据字典视图把SQL语句的响应时间分析变得非常的简单,比起以
前运用消耗时间的trace方法来说。
总结
DBA们和性能分析专家们管理Oracle10g数据库的性能时会发现在最新的
Oracle旗舰数据库中已经把许多的响应时间数据做成了动态性能视图。这些统
计信息将有助于迅速找出大型复杂数据库中的性能瓶颈所在。
本文发布于:2022-11-16 15:42:23,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/32176.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |