通过案例学调优之--模拟buffer busy waits事件

简介:

buffer busy waits等待事件

1
     Wait occurs when a session attempts to access a block  in  memory, is denied  and  must wait until the buffer becomes available. This event happens because a buffer is either being read  into  the buffer cache by another session ( and  the session is waiting  for  that read to complete)  or  the buffer is  in  the buffer cache, but  in  a incompatible mode (that is, some other session is changing the buffer).

Solutions:

1
2
3
4
5
     Buffer busy waits often occur  in  the following cases:
Inefficient SQL statements read more blocks than necessary. If there are many sessions running these statements, they will attempt to read the same blocks  and  possibly wait  on  this  event.
If the FREELISTS parameter  for  a table is too low, multiple sessions that are attempting to  insert  rows  in  the same table  and  end up waiting  for  freelists. This problem shows up  as  contention  for  the segment header of the table.
Multiple sessions are attempting to change an index block (possibly do to an  insert ).
The INITRANS parameters is too low  for  a segment. Any DML operation that needs to go  into  the block needs to lock an Interested Transaction List (ITL). If INITRANS parameter is set too low,  then  there will be less number of ITLs allocated originally. Oracle can only allocate more ITLs  if  there is space  in  PCTFREE area of the block. If, however, there is no space to increase the ITL, the transactions that cannot lock ITLs will have to wait until the previous transactions have completed operations  on  the block. The waiter will register ‘buffer busy wait’  for  the block


案例分析:

1、建立测试表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
13 : 35 : 51  SCOTT@ prod >create table tb1 (id int ,name varchar2( 10 ));
Table created.
 
13 : 36 : 16  SCOTT@ prod > insert  into  tb1 values ( 1 , 'scott' );
1  row created.
 
13 : 36 : 35  SCOTT@ prod > insert  into  tb1 values ( 2 , 'tom' );
1  row created.
 
13 : 36 : 47  SCOTT@ prod >commit;
Commit complete.
 
13 : 37 : 09  SCOTT@ prod >select sid  from  v$mystat  where  rownum= 1 ;
        SID
----------
         37
 
13 : 37 : 25  SCOTT@ prod >grant all  on  tb1 to tom;
Grant succeeded.

2、session 1做事务处理

1
2
3
4
5
6
7
13 : 40 : 24  SCOTT@ prod >begin
13 : 41 : 18    2   for  in  1. .100000  loop
13 : 41 : 29    3   update tb1 set name= 'rose'  where  id= 2 ;
13 : 41 : 56    4   commit;
13 : 41 : 58    5   end loop;
13 : 42 : 02    6   end;
13 : 42 : 04    7   /

3、session 2做事务处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
13 : 40 : 48  SYS@ prod >conn tom/tom
Connected.
13 : 40 : 52  TOM@ prod >select sid  from  v$mystat  where  rownum= 1 ;
        SID
----------
         43
 
13 : 41 : 08  TOM@ prod >begin
13 : 43 : 15    2   for  in  1. .100000  loop
13 : 43 : 22    3   update scott.tb1 set name= 'john'  where  id= 1 ;
13 : 43 : 43    4   commit;
13 : 43 : 45    5   end loop;
13 : 43 : 49    6   end;
13 : 43 : 50    7   /

4、查看会话等待事件

如果事务在运行过程中可以访v$session_wait,如果事务运行结束可以访问v$session_wait_history

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
13 : 44 : 55  SYS@ prod > select event,sid,p1,p2,p3  from  v$session_wait_history  where  sid  in  ( 37 , 43 and  event like  '%buffer%'
EVENT                                                                   SID         P1         P2         P3
---------------------------------------------------------------- ---------- ---------- ---------- ----------
log buffer space                                                          37           0           0           0
log buffer space                                                          37           0           0           0
log buffer space                                                          43           0           0           0
log buffer space                                                          43           0           0           0
log buffer space                                                          43           0           0           0
 
13 : 44 : 56  SYS@ prod >select event,sid,p1,p2,p3  from  v$session_wait_history  where  sid  in  ( 37 , 43 and  event like  '%buffer%'
EVENT                                                                   SID         P1         P2         P3
---------------------------------------------------------------- ---------- ---------- ---------- ----------
buffer busy waits                                                         37           6         203           1
buffer busy waits                                                         37           6         203           1
buffer busy waits                                                         37           6         203           1
buffer busy waits                                                         37           6         203           1
latch: cache buffers chains                                               37   372066908         150           0
buffer busy waits                                                         37           6         203           1
buffer busy waits                                                         43           6         203           1
latch: cache buffers chains                                               43   372066908         150           0
buffer busy waits                                                         43           6         203           1
buffer busy waits                                                         43           6         203           1
latch: cache buffers chains                                               43   372066908         150           0
latch: cache buffers chains                                               43   372066908         150           0
12  rows selected.
 
可以看到引起‘buffer busy waits’的block: file#为 6 ,block#为 203

5、判断等待事件访问的块类型

1
2
3
4
5
6
13 : 45 : 17  SYS@ prod >select *  from  v$waitstat  where  count > 0 ;
CLASS                   COUNT       TIME
------------------ ---------- ----------
data block                 144         754
file header block            9          44
undo header                  7           1

6、查看引起‘buffer busy waits’事件的sql语句

1
2
3
4
13 : 52 : 13  SYS@ prod >select sql_text  from  V$sqlarea   where  (address,hash_value)  in  (select sql_address,sql_hash_value  from  v$session   where  event like  '%buffer busy%' )
SQL_TEXT
------------------------------------------------------------------------------------------------------------------------
UPDATE TB1 SET NAME= 'rose'  WHERE ID= 2

7、查看引起‘buffer busy waits’事件的块类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
14 : 11 : 00  SYS@ prod > SELECT  'segment Header'  CLASS,
   2   a.Segment_Type,
   3   a.Segment_Name,
   4   a.Partition_Name
   5   FROM Dba_Segments a,
   6   V$session_Wait b
   7   WHERE a.Header_File = b.P1
   8   AND a.Header_Block = b.P2
   9   AND b.Event =  'buffer busy waits'
  10   UNION
  11   SELECT  'freelist Groups'  CLASS,
  12   a.Segment_Type,
  13   a.Segment_Name,
  14   a.Partition_Name
  15   FROM Dba_Segments a,
  16   V$session_Wait b
  17   WHERE b.P2 BETWEEN a.Header_Block +  1  AND (a.Header_Block + a.Freelist_Groups)
  18   AND a.Header_File = b.P1
  19   AND a.Freelist_Groups >  1
  20   AND b.Event =  'buffer busy waits'
  21   UNION
  22   SELECT a.Segment_Type ||  ' Block'  CLASS,
  23   a.Segment_Type,
  24   a.Segment_Name,
  25   a.Partition_Name
  26   FROM Dba_Extents a,
  27   V$session_Wait b
  28   WHERE b.P2 BETWEEN a.Block_Id AND a.Block_Id + a.Blocks -  1
  29   AND a.File_Id = b.P1
  30   AND b.Event =  'buffer busy waits'
  31   AND NOT EXISTS (SELECT  1
  32   FROM Dba_Segments
  33   WHERE Header_File = b.P1
  34 * AND Header_Block = b.P2)
CLASS                    SEGMENT_TYPE       SEGMENT_NAME         PARTITION_NAME
------------------------ ------------------ -------------------- ------------------------------
TABLE Block              TABLE              TB1

8、查看引起‘buffer busy waits’事件的segment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
13 : 57 : 25  SYS@ prod >col segment_name  for  a30
13 : 57 : 38  SYS@ prod >select owner,segment_name,segment_type,block_id  from  dba_extents  where  file_id= 6
OWNER                          SEGMENT_NAME                   SEGMENT_TYPE         BLOCK_ID
------------------------------ ------------------------------ ------------------ ----------
SCOTT                          EMP1                           TABLE                      128
SCOTT                          EMP1                           TABLE                      144
SCOTT                          EMP1                           TABLE                      160
SCOTT                          EMP1                           TABLE                      168
SCOTT                          EMP1                           TABLE                      184
SCOTT                          MLOG$_EMP1                     TABLE                      136
SCOTT                          MLOG$_EMP1                     TABLE                      152
SCOTT                          MLOG$_EMP1                     TABLE                      176
SCOTT                          MLOG$_EMP1                     TABLE                      192
SCOTT                          TB1                            TABLE                      200
10  rows selected.

因为表TB1的block#,接近引起“buffer busy waits”事件的block#(203),从而判断热块是在表tb1上。

9、查询访问tb1的sql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
14 : 01 : 31  SYS@ prod >select sql_text  from  v$sqlarea  where  sql_text like  '%tb1%' ;
SQL_TEXT
------------------------------------------------------------------------------------------------------------------------
  begin   for  in  1. .100000  loop  update tb1 set name= 'rose'  where  id= 2 ; commit;  end loop;  end;
  select sql_text  from  v$sqlarea  where  sql_text like  '%tb1%'
select sql_text  from  v$sqlarea  where  sql_text like  '%tb1%'
  begin   for  in  1. .100000  loop  update scott.tb1 set name= 'rose'  where  id= 2 ; commit;  end loop;  end;
 
14 : 01 : 45  SYS@ prod >select sql_text  from  v$sqlarea  where  sql_text like  '%tb1%' ;
SQL_TEXT
------------------------------------------------------------------------------------------------------------------------
  begin   for  in  1. .100000  loop  update tb1 set name= 'rose'  where  id= 2 ; commit;  end loop;  end;
  select sql_text  from  v$sqlarea  where  sql_text like  '%tb1%'
select sql_text  from  v$sqlarea  where  sql_text like  '%tb1%'
  begin   for  in  1. .100000  loop  update scott.tb1 set name= 'rose'  where  id= 2 ; commit;  end loop;  end;









本文转自 客居天涯 51CTO博客,原文链接:http://blog.51cto.com/tiany/1546187,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
Linux
perf_event_open学习 —— 缓冲区管理
perf_event_open学习 —— 缓冲区管理
|
2月前
|
监控 Linux C++
perf_event_open学习 —— mmap方式读取
perf_event_open学习 —— mmap方式读取
|
2月前
|
Linux C语言 Python
perf_event_open 学习 —— 通过read的方式读取硬件技术器
perf_event_open 学习 —— 通过read的方式读取硬件技术器
|
3月前
|
缓存 关系型数据库 MySQL
整体方案 参数调优 innodb_buffer_pool_size
【8月更文挑战第14天】
45 0
|
6月前
|
Java
Direct Memory读写流程分析
Direct Memory读写流程分析
30 0
|
SQL Oracle NoSQL
gdb调试之--read by other session 等待事件的重现
发生read by other session 等待事件,肯定是两个会话同时物理读同一个数据块,假设有两个会话,会话1发生物理读,会话2正要去物理读发现会话1正在物读理产生,此时会话2发生等待,此等待就是read by other session 等待事件。
|
SQL NoSQL Oracle
[20180305]手工模拟buffer busy wait.txt
[20180305]手工模拟buffer busy wait.txt --//一般出现buffer busy wait原因,主要是对热块,大量dml操作. --//一种提法:oracle读不会阻塞写,写不会阻塞读,实际上写一定程度会阻塞读,只不过时间很短罢了.
1131 0
|
机器学习/深度学习 SQL 关系型数据库