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”等待。