失效链接处理 |
Oracle数据库性能分析优化实践分析 PDF 下载
本站整理下载:
相关截图:
主要内容:
2 交易超时原因和解决办法
2.1 交易超时的定义和来源
经与应用团队李永沟通,交易超时并非来自于业务使用部门海航的反馈,也不是诸如携
程、同程、去哪儿网等第三方代理机构的投诉,而是源自应用自身的监控。
应用将监控对于数据库有变更的交易的响应时间,而查询不在监控范围内(例如订单查
询),如果交易的响应时间超过 120 秒,则进行报警。
2.2 获取交易超时的事务和 SQL
我们首先查询 v$active_session_history 中 XID 非空的会话,获得最小采样时间和最大采
样时间,两者相减即为某一个事务的响应时间。查询如下
select xid,
min(sample_time) min_sample_time,
max(sample_time) max_sample_time,
(to_date(to_char(max(sample_time), 'yyyymmdd hh24:mi:ss'),
'yyyymmdd hh24:mi:ss') -
to_date(to_char(min(sample_time), 'yyyymmdd hh24:mi:ss'),
'yyyymmdd hh24:mi:ss')) * 24 * 3600 execute_seconds
from v$active_session_history
where to_char(sample_time, 'yyyymmdd hh24:mi:ss') between
'20170119 15:00:00' and '20170119 17:00:00'
and xid is not null
group by xid
having(to_date(to_char(max(sample_time), 'yyyymmdd hh24:mi:ss'), 'yyyymmdd
hh24:mi:ss') - to_date(to_char(min(sample_time), 'yyyymmdd hh24:mi:ss'),
'yyyymmdd hh24:mi:ss')) * 24 * 3600 >= 1
order by (to_date(to_char(max(sample_time), 'yyyymmdd hh24:mi:ss'),
更多 IT 认证课程请访问 美河学习在线 www.eimhe.com
'yyyymmdd hh24:mi:ss') -
to_date(to_char(min(sample_time), 'yyyymmdd hh24:mi:ss'),
'yyyymmdd hh24:mi:ss')) * 24 * 3600
需要说明的是,一个事务可能包含了多条 DML 和查询的组合,多条 SQL 组合起来导致
120 秒超时,因此需要以 xid 为单位进行 group by。
进一步的,发出下列查询,即可获得上述查询返回的 XID 对应的 SQL 语句的详情。
select sql_id, sql_opname ,count(*)
from v$active_session_history
where to_char(sample_time, 'yyyymmdd hh24:mi:ss') between
'20170119 15:00:00' and '20170119 17:00:00'
and xid is not null
and xid in (..)
group by sql_id, sql_opname
结果如下所示,得到的记录数与应用交易超时的笔数基本吻合
sql_id sql_opname count(*)
5xpsj3wxf2wnt DELETE 98
sql_id 为 5xpsj3wxf2wnt 的完整 SQL 语句如下所示
DELETE FROM search WHERE SPNRID = :1 AND (TYPE = :2 OR TYPE = :3 OR TYPE = :4 )
2.3 交易超时相关 SQL 性能分析 1)资源消耗情况如下:
单次执行时间 166 秒,平均单次执行删除的记录数不到 1 行,单次逻辑读达到 50 万以上,
执行时间 60%消耗在 IO 上,30%消耗在 CPU 上。
根据这些资源消耗,可知 SQL 语句存在效率问题,判断标准如下:
ORACLE 中,数据存储的最小单位是 BLOCK,默认地,一个 BLOCK 是 8k.表数据的一条
记录,通常平均一行记录的长度在几十到几百个字节,意味着一个 BLOCK 可以存储几十到
几百条记录。
操作一个 BLOCK,就发生了一次逻辑读。语句的平均逻辑读在 50 万左右,即执行这个 SQL
总计需要需要操作 50 万个 BLOCK,而一个 BLOCK 是 8K 字节。
|