oracle-Oracle等待事件之buffer busy waits

简介:

Oracle等待事件之buffer busy waits

产生原因

官方定义:

This wait happens when a session wants to access a database block in the buffer cache but it cannot as the buffer is "busy". The two main cases where this can occur are:
Another session is reading the block into the buffer
Another session holds the buffer in an incompatible mode to our request

模拟等待

1.创建测试表并插入数据:

SQL> create table tb1 (id int ,name varchar2(10));

Table created.

SQL> insert into tb1 values (1,'scott');

1 row created.

SQL> insert into tb1 values (2,'tom');

1 row created.

SQL> commit;

Commit complete.

2. 会话1循环不断修改数据:

SQL> select userenv('sid') from dual;

USERENV('SID')
--------------
             1
             
SQL> begin
for i in 1..100000000 loop
update tb1 set name='rose' where id=2;
commit;
end loop;
end;
/

2. 会话2也循环不断修改数据:

SQL> select userenv('sid') from dual;

USERENV('SID')
--------------
            27

SQL> begin
for i in 1..100000000 loop
update tb1 set name='john' where id=1;
commit;
end loop;
end;
/

3. 在会话3查看等待情况:

--定位等待buffer busy waits的会话和执行的sql

SQL> SELECT g.inst_id,g.sid,g.serial#,g.event,g.username,g.sql_hash_value,s.sql_fulltext
FROM gv$session g,v$sql s
WHERE g.sql_hash_value = s.hash_value and username='HR' and event='buffer busy waits';
   INST_ID        SID    SERIAL# EVENT                          USERNAME   SQL_HASH_VALUE SQL_FULLTEXT
---------- ---------- ---------- ------------------------------ ---------- -------------- --------------------------------------------------
         1          1          7 buffer busy waits              HR              401484711 UPDATE TB1 SET NAME='rose' WHERE ID=2
         1         27         49 buffer busy waits              HR             2040921087 UPDATE TB1 SET NAME='john' WHERE ID=1

--定位到热点快

SQL> select event,sid,p1,p2,p3 from v$session_wait_history where event='buffer busy waits'
EVENT                       SID         P1         P2         P3
-------------------- ---------- ---------- ---------- ----------
buffer busy waits             1          4       5471          1
buffer busy waits             1          4       5471          1
buffer busy waits             1          4       5471          1
buffer busy waits             1          4       5471          1
buffer busy waits             1          4       5471          1
buffer busy waits            27          4       5471          1
buffer busy waits            27          4       5471          1
buffer busy waits            27          4       5471          1
buffer busy waits            27          4       5471          1
buffer busy waits            27          4       5471          1

10 rows selected.

--P1=file#
--P2=block#

--定位到块所属的段

SQL> SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, A.PARTITION_NAME FROM DBA_EXTENTS A WHERE FILE_ID = 4 AND 5471 BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1;

OWNER      SEGMENT_NAME         SEGMENT_TYPE       TABLESPACE_NAME                PARTITION_NAME
---------- -------------------- ------------------ ------------------------------ ------------------------------
HR         TB1                  TABLE              USERS

解决方法

As buffer busy waits are due to contention for particular blocks then you cannot take any action until you know which blocks are being competed for and why.
Eliminating the cause of the contention is the best option. 
Note that "buffer busy waits" for data blocks are often due to several processes repeatedly reading the same blocks (eg: if lots of people scan the same index) 
- the first session processes the blocks that are in the buffer cache quickly but then a block has to be read from disk 
- the other sessions (scanning the same index) quickly 'catch up' and want the block which is currently being read from disk 
- they wait for the buffer as someone is already reading the block in.

The following hints may be useful for particular types of contention - these are things that MAY reduce contention for particular situations:

Block Type    Possible Actions
- data blocks    Eliminate HOT blocks from the application. Check for repeatedly scanned / unselective indexes. Change PCTFREE and/or PCTUSED. 
                Check for 'right- hand-indexes' (indexes that get inserted into at the same point by many processes). Increase INITRANS. Reduce the number of rows per block.
- segment header    Increase of number of FREELISTs. Use FREELIST GROUPs (even in single instance this can make a difference).
- freelist blocks    Add more FREELISTS. In case of Parallel Server make sure that each instance has its own FREELIST GROUP(s).
- undo header    Add more rollback segments.
参考: WAITEVENT: "buffer busy waits" Reference Note (Doc ID 34405.1)
目录
相关文章
|
11月前
|
Oracle 关系型数据库 数据库
Oracle-等待事件解读
Oracle-等待事件解读
44 0
|
SQL Oracle 关系型数据库
|
SQL 关系型数据库 Java
|
关系型数据库 数据库 Oracle
|
SQL Oracle 关系型数据库
|
Oracle 关系型数据库 数据库

推荐镜像

更多