1. 现象
6月8日13:15,某银行信用卡交易处理响应超时。
2. 分析
从v$active_session_history视图中显示,在13:15:06-13:15:19时间段内,sql_id为“0tgfgq061mcbk”的语句出现“read by other session”等待,语句内容如下:
UPDATE LINC.MSDB_ACCT SET AGEING_A=NVL(:1, ' '), AGEING_G=NVL(:2, ' '), ETL_DAY=:3, MTHS_ODUE=:4, ODUE_HELD=:5 WHERE ROWID = :6;
在13:15:19,有12个会话正在执行该sql语句(会话数与处理交易的进程总数一致),其中,有1个会话事件为“db file sequential read”,该事件一般与单块读操作有关(比如访问索引),注意这里的sequential read指的是将数据文件上的块读入到内存的连续区域中。其他11个会话都出现“read by other session”等待事件。
SAMPLE_ID | SAMPLE_TIME | SESSION_ID | SQL_ID | EVENT |
38192645 | 08-6月 -11 01.15.19.232 下午 | 825 | 0tgfgq061mcbk | read by other session |
38192645 | 08-6月 -11 01.15.19.232 下午 | 867 | 0tgfgq061mcbk | read by other session |
38192645 | 08-6月 -11 01.15.19.232 下午 | 842 | 0tgfgq061mcbk | read by other session |
38192645 | 08-6月 -11 01.15.19.232 下午 | 814 | 0tgfgq061mcbk | read by other session |
38192645 | 08-6月 -11 01.15.19.232 下午 | 800 | 0tgfgq061mcbk | read by other session |
38192645 | 08-6月 -11 01.15.19.232 下午 | 779 | 0tgfgq061mcbk | read by other session |
38192645 | 08-6月 -11 01.15.19.232 下午 | 766 | 0tgfgq061mcbk | db file sequential read |
38192645 | 08-6月 -11 01.15.19.232 下午 | 760 | 0tgfgq061mcbk | read by other session |
38192645 | 08-6月 -11 01.15.19.232 下午 | 733 | 0tgfgq061mcbk | read by other session |
38192645 | 08-6月 -11 01.15.19.232 下午 | 723 | 0tgfgq061mcbk | read by other session |
38192645 | 08-6月 -11 01.15.19.232 下午 | 713 | 0tgfgq061mcbk | read by other session |
38192645 | 08-6月 -11 01.15.19.232 下午 | 836 | 0tgfgq061mcbk | read by other session |
从视图中发现,当时12个会话均在访问21号数据文件的第1394515号块。
CURRENT_OBJ# | CURRENT_FILE# | CURRENT_BLOCK# |
43146 | 21 | 1394515 |
可以用以下语句定位该块信息:
SELECT owner,segment_name,segment_type,tablespace_name FROM dba_extents where file_id=21 and block_id<=1394515 and block_id+blocks>1394515;
OWNER | SEGMENT_NAME | SEGMENT_TYPE | TABLESPACE_NAME |
LINC | MSDB_ACCT | TABLE | DATATB |
通过查询,该块属于LINC.MSDB_ACCT表。这和我们定位的sql语句是一致的。
当数据被请求访问时,oracle会首先将该数据从磁盘读到数据缓冲区中,如果有2个或2个以上会话请求同一份数据,那么第一个会话会读入该数据到缓冲区,其他会话会出现等待。在oracle 10g以后,该等待事件从“Buffer Busy Wait”中分离开,成为“read by other session”事件。
3. 结论
从数据库层面来分析,本次银行出现交易响应时间过长的原因为:多个会话同时对LINC.MSDB_ACCT表进行UPDATE,且请求读取同一个数据块,造成读竞争,相关会话出现“read by other session”等待。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20750200/viewspace-697835/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/20750200/viewspace-697835/