数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle10g中如何分析响应时间


发布日期:2020年09月15日
 
Oracle10g中如何分析响应时间

在Oracleg中以前版本中比较难于获取的响应时间数据将会变得非常容易获取

在以前看来为了尽量获得数据库的最佳性能Oracle的DBA们和性能分析专家一直很困难获得系统以及用户会话活动的一致的响应时间数据DBA们面临的问题一直以来包括两个方面第一个方面是准确定位数据库或者用户会话究竟在哪里消耗了时间第二个方面就是确定用户体验的客观性质

在数据库中产生所有可能的行为和交互作用这些任务都不是没有价值的Oracle等待接口在之前的很早的Oracle数据库版本中开始介绍的对于那些知道如何使用等待接口的管理员来说这已经成为一个伟大的开始即使它仍然缺乏告诉DBA系统或者用户会话是否有效的处理了事务或者查询这个理想的能力启用和钻研跟蹤文件能够存储这个级别上的详细信息但是对于大多数超负荷工作管理大型数据库的DBA们这个钻研是奢侈的而耗费时间的

幸运的是那些将数据库升级到Oracleg的DBA们将会发现找到主要的响应时间变得很容易可以允许一个非常好的图表来显示系统和会话级的响应时间数据很重要的一点Oracle的ADDM提供了一个查看响应时间的方法通过自动分析收集的统计信息识别问题区域甚至可以通过Oracle企业管理器网络控制的图形界面提供建议

此外与我们这里讨论相关的是Oracleg数据库的历史数据机制允许DBA们按时查看对响应时间趋势的分析这将有助于DBA们确定事务/系统的高峰时期更好的定位那些拉长批处理周期和ETL作业的进程和SQL语句

这里主要讨论用于系统会话和SQL级别上那些历史机制的用途

系统层的响应时间分析

先来看看典型的几个经常问到DBA们的问题

通常来说数据库运行的状况如何?

用户体验感觉的平均响应时间是多少?

什么行为是最影响整个响应时间的?

上述问题在Oracleg数据库之前对于DBA们来说是相当不好回答的但是如果使用了最新的Oracleg数据库之后这些数据信息将会很容易的被捕获到

首先Oracleg数据库运行的状况如何这个问题可以通过下面的查询来获得

select METRIC_NAMEVALUE

from SYSV_$SYSMETRIC

where METRIC_NAME IN (Database CPU Time RatioDatabase Wait Time Ratio

AND INTSIZE_CSEC = (select max(INTSIZE_CSEC) from SYSV_$SYSMETRIC)

METRIC_NAME VALUE

Database Wait Time Ratio

Database CPU Time Ratio

Oracleg数据库中的V$SYSMETRIC视图中存在一些非常有用的响应时间数据其中两个比较重要的就是Wait Time Ratio 和Database CPU Time Ratio上面的查询显示了数据库中最新的关于这两个统计数据的快照这将有助于帮助我们确定是否数据库正在经历着一个比较高的等待百分率和瓶颈数据库的CPU Time Ratio是由数据库中的database time的数值除以CPU的数量database time定义为数据库消耗在用户级别调用所花费的时间(不包括实例的后台进程活动所消耗的时间)比较高的值(%%以上)代表很少等待和瓶颈活动因为各个系统不同这个阀值只能作为一个一般的规则来使用

还可以使用如下的查询来迅速查看最新一个小时的信息看看数据库的总性能如何

select end_timevalue

from sysv_$sysmetric_history

where metric_name = Database CPU Time Ratio

order by

END_TIME VALUE

可以从V$SYSMETRIC_SUMMARY视图中获得数据库整体性能效率的最大最小和平均值

select CASE METRIC_NAME

WHEN SQL Service Response Time then SQL Service Response Time (secs)

WHEN Response Time Per Txn then Response Time Per Txn (secs)

ELSE METRIC_NAME

END METRIC_NAME

CASE METRIC_NAME

WHEN SQL Service Response Time then ROUND((MINVAL /

WHEN Response Time Per Txn then ROUND((MINVAL /

ELSE MINVAL

END MININUM

CASE METRIC_NAME

WHEN SQL Service Response Time then ROUND((MAXVAL /

WHEN Response Time Per Txn then ROUND((MAXVAL /

ELSE MAXVAL

END MAXIMUM

CASE METRIC_NAME

WHEN SQL Service Response Time then ROUND((AVERAGE /

WHEN Response Time Per Txn then ROUND((AVERAGE /

ELSE AVERAGE

END AVERAGE

from SYSV_$SYSMETRIC_SUMMARY

where METRIC_NAME in (CPU Usage Per Sec

CPU Usage Per Txn

Database CPU Time Ratio

Database Wait Time Ratio

Executions Per Sec

Executions Per Txn

Response Time Per Txn

SQL Service Response Time

User Transaction Per Sec

ORDER BY

METRIC_NAME MININUM MAXIMUM AVERAGE

CPU Usage Per Sec

CPU Usage Per Txn

Database CPU Time Ratio

Database Wait Time Ratio

Executions Per Sec

Executions Per Txn

Response Time Per Txn (secs)

SQL Service Response Time (secs)

User Transaction Per Sec

上面的查询包含了更多的详细的响应时间数据DBA们还需要收集在系统级别上的用户通讯的平均响应时间上面的查询给出了需要的结果如果用户抱怨响应时间太慢那么DBA就应该查看Response Time Per Txn和SQL Service Response Time数据是否存在数据库问题

如果响应时间不在是那么渴求那么DBA就会想了解究竟是什么类型的用户活动让数据库的响应变得如此的慢在Oracleg数据库之前这些信息 是比较难获取的但是现在就变得非常容易执行如下查询

select case db_stat_name

when parse time elapsed then

soft parse time

else db_stat_name

end db_stat_name

case db_stat_name

when sql execute elapsed time then

time_secs plsql_time

when parse time elapsed then

time_secs hard_parse_time

else time_secs

end time_secs

case db_stat_name

when sql execute elapsed time then

round( * (time_secs plsql_time) / db_time

when parse time elapsed then

round( * (time_secs hard_parse_time) / db_time

else round( * time_secs / db_time

end pct_time

from

(select stat_name db_stat_name

round((value / ) time_secs

from sysv_$sys_time_model

where stat_name not in(DB timebackground elapsed time

background cpu timeDB CPU))

(select round((value / ) db_time

from sysv_$sys_time_model

where stat_name = DB time

(select round((value / ) plsql_time

from sysv_$sys_time_model

where stat_name = PL/SQL execution elapsed time

(select round((value / ) hard_parse_time

from sysv_$sys_time_model

where stat_name = hard parse elapsed time

order by desc

DB_STAT_NAME TIME_SECS PCT_TIME

sql execute elapsed time

hard parse elapsed time

PL/SQL execution elapsed time

PL/SQL compilation elapsed time

soft parse time

connection management call elapsed time

hard parse (sharing criteria) elapsed time

repeated bind elapsed time

failed parse elapsed time

hard parse (bind mismatch) elapsed time

RMAN cpu time (backup/restore)

inbound PL/SQL rpc elapsed time

sequence load elapsed time

Java execution elapsed time

failed parse (out of shared memory) elapsed time

可以在V$SYS_TIME_MODEL视图中找到相应的主要花费时间处理的部分然后就可以根据这些来对数据库进行相应的调整

除了活动时间DBA也还想知道整体的等待时间在Oracleg数据库之前DBA必须查看单独的等待事件来找出等待和瓶颈现在Oracleg数据库提供一个等待的概要机制

select WAIT_CLASS

TOTAL_WAITS

round( * (TOTAL_WAITS / SUM_WAITS)) PCT_WAITS

ROUND((TIME_WAITED / ) TIME_WAITED_SECS

round( * (TIME_WAITED / SUM_TIME)) PCT_TIME

from

(select WAIT_CLASS

TOTAL_WAITS

TIME_WAITED

from V$SYSTEM_WAIT_CLASS

where WAIT_CLASS != Idle

(select sum(TOTAL_WAITS) SUM_WAITS

sum(TIME_WAITED) SUM_TIME

from V$SYSTEM_WAIT_CLASS

where WAIT_CLASS != Idle

order by desc

WAIT_CLASS TOTAL_WAITS PCT_WAITS TIME_WAITED_SECS PCT_TIME

User I/O

Other

System I/O

Concurrency

Commit

Network

Application

这样就能非常容易的找出大部分的整体等待时间如同响应时间数据一样我们可以用下面的查询来及时回顾最新的一个小时等待类型

select asid

busername

await_class

atotal_waits

round((atime_waited / ) time_waited_secs

from sysv_$session_wait_class a

sysv_$session b

where bsid = asid and

busername is not null and

await_class != Idle

order by desc

SID USERNAME WAIT_CLASS TOTAL_WAITS TIME_WAITED_SECS

SYS User I/O

SYS User I/O

SYS Network

SYS Network

SYS Application

这个时候就可以检查标准的单独等待事件就如在以前版本的Oracle数据库中查询V$SESSION_WAIT和V$SESSION_EVENT视图在Oracleg数据库中DBA还将可以找出新的等待类型在这两张视图中如果需要找出以前哪个会话登录并且消耗了大部分的资源你可以使用下面的查询下面的例子是查找午夜点到点的数据库活动并且包括用户的I/O等待

select sess_id

username

program

wait_event

sess_time

round( * (sess_time / total_time)) pct_time_waited

from

(select asession_id sess_id

decode(session_typebackgroundsession_typecusername) username

aprogram program

bname wait_event

sum(atime_waited) sess_time

from sysv_$active_session_history a

sysv_$event_name b

sysdba_users c

where aevent# = bevent# and

auser_id = cuser_id and

sample_time > JAN AM and

sample_time < JAN AM and

bwait_class = User I/O

group by asession_id

decode(session_typebackgroundsession_typecusername)

aprogram

bname)

SQL语句响应时间分析

在Oraclei数据库中查看SQL语句的响应时间就变得比较容易了现在在Oracleg中DBA们拥有更多的工具可以帮助他们跟蹤效率低下的数据库代码以前可以用来查询的视图是V$SQLAREA从Oraclei开始这个视图增加了ELAPSED_TIME和CPU_TIME两个列这极大的有助于去确定实际用户的SQL语句的执行经历(如果除以执行的次数列EXECUTIONS那么将得到平均每次执行这个SQL语句所用的平均时间)在Oracleg数据库中V$SQLAREA视图中增加了个新的和等待以及时间相关的列

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语句能帮助找到前位用户I/O等待最高的SQL语句

select * from

(select sql_text

sql_id

elapsed_time

cpu_time

user_io_wait_time

from sysv_$sqlarea

order by desc)

where rownum <

SQL_TEXT SQL_ID ELAPSED_TIME CPU_TIME USER_IO_WAIT_TIME

DECLARE job BINARY_INTEGER = job next_date DATE = mydate broken BOOLEAN gvchxucag

select /*+ index(idl_ub$ i_idl_ub) +*/ piece#lengthpiece from idl_ub$ wher cvnbyzsu

select ssynonym_name object_name oobject_type from sysall_synonyms s s fqmpmkfrpqyk

select /*+ rule */ bucket endpoint col# epvalue from histgrm$ where obj#= a dbfxqxwxtr

select /*+ index(idl_ub$ i_idl_ub) +*/ piece#lengthpiece from idl_ub$ wher msxkba

当然获取最消耗时间或者等待时间最长的SQL语句非常不错但是同时也需要抓住其要点——在V$ACTIVE_SESSION_HISTORY视图中又一次出现的SQL语句通过这个视图能够找出具体什么等待时间延迟了SQL语句执行连同实际的文件对象以及阻塞的对象导致等待

例如设想已经找到一个特别的SQL语句看上去在用户I/O等待时间方面极端的严重那么可以执行下面的查询来得到等待时间中各个单独的等待事件等待的文件等待的对象

select event

time_waited

owner

object_name

current_file#

current_block#

from sysv_$active_session_history a

sysdba_objects b

where sql_id = gvchxucag and

acurrent_obj# = bobject_id and

time_waited <>

EVENT TIME_WAITED OWNER OBJECT_NAME file block

db file sequential read SYSMAN MGMT_METRICS_HOUR_PK

db file sequential read SYSMAN SEVERITY_PRIMARY_KEY

当然也可以通过使用V$ACTIVE_SESSION_HISTORY视图中的历史数据的方式来限制一段特殊时间内的没有优化的SQL语句问题在于Oracleg数据库通过简化的数据字典视图把SQL语句的响应时间分析变得非常的简单比起以前运用消耗时间的trace方法来说

总结

DBA们和性能分析专家们管理Oracleg数据库的性能时会发现在最新的Oracle旗舰数据库中已经把许多的响应时间数据做成了动态性能视图这些统计信息将有助于迅速找出大型复杂数据库中的性能瓶颈所在

上一篇:oracle中SGA的设置

下一篇:Oracle认证价值的思考