相克军_Oracle体系_随堂笔记005-Database buffer cache

时间:2020-12-08 07:41:06
本章主要阐述SGA中的Database buffer cache。
Buffer cache {
1.pin (读写瞬间的状态)
2.clean
3.dirty
4.unused
}
--Database buffer cache
概述:
1.段、区、块的概念:
create table t2 (
    id int,
    name varchar2(30)
);
建立一个表,同时建立一个段,
建立段的同时,会给段分配一个区,
区是物理上连续的几个块。
区是oracle给段分配的最小单位。
块是oracle I/O的最小单位。
insert into t2 values(1,'xiaobei');
访问:
访问一个块,
一般情况下,一个块中有多个行(行链接,行迁移除外)。
相克军_Oracle体系_随堂笔记005-Database buffer cache
2.buffer cache的意义:
①减少I/O:物理I/O,逻辑I/O
②构造cr块
 
引入undo:Oracle在修改数据以前,会将数据写到undo中。
undo的作用{
回滚未提交事物;
构造cr块。
}
相克军_Oracle体系_随堂笔记005-Database buffer cache
这里会引出两个更深入的问题:①会话2如何知道会话1没有提交?②cr块如何从undo空间中找到被删除的那一行。
 
3.buffer cache的内存组织结构
CBC、LRU、LRUW、CHECKPOINT QUEUE
CBC    按照块地址将buffer链起来。
相克军_Oracle体系_随堂笔记005-Database buffer cache
LRU    最近最少使用的顺序链起来。可用块~
    LRU,MRU(最近最多使用)
LRUW    脏块的,DBWn以此为标准优先写最近最少使用的脏块。
相克军_Oracle体系_随堂笔记005-Database buffer cache
CHECKPOINT QUEUE    也是关于脏块的,按块第一次脏的时间点链起来。
相克军_Oracle体系_随堂笔记005-Database buffer cache
注:在Oracle中,一般都是采用双向的链。
 
4.DB_WRITER_PROCESSES
1
2
3
4
5
6
7
SQL>
show parameter writer
  
NAME                                  TYPE        VALUE
------------------------------------
----------- ------------------------------
db_writer_processes                   integer      1
SQL>  alter  system  set  db_writer_processes = 2 scope=spfile;
--DBWn数量一般设定是服务器核心数/8.
 
5.buffer cache的重要参数配置
1
2
3
4
5
6
7
8
9
10
alter  system  set  db_cache_size=200m scope=both;
设置顺序:
sga_max_size
sga_target
db_cache_size
在OLTP系统中,buffer
cache的大小一般设置为sga_max_size的2/3.
DB_CACHE_SIZE
= SGA_MAX_SIZE/2 ~ SGA_MAX_SIZE*2/3
使用advice来确认buffer
cache的大小
根据语句查询buffer
cache该设置多大合适。减少I/O(物理读次数)
平日注意收集积累一些常用的语句》。
 
6.Block状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
buffer
header:
SQL>  desc  x$bh   
  
state:0~8
0, free
1,XCUR
2,SCUR
3,CR
4, READ     从block写入buffer的那个过程
5,MREC
6,IREC
7,write
8,pi
  
SQL>  select  distinct  state  from  x$bh;
非RAC环境下, current 永远等于xcur。
RAC下,有scur
 
Q:current块和cr块区别?
A:
1
2
cr块被构造后被读出,就马上没意义了。。马上就可以被覆盖了。。
要修改一个块,只能修改 current 块。

Q:查看一个对象占用了多少不同状态的buffer?

A:
1
2
3
4
5
6
7
8
9
10
select
o.object_name,
decode(state,0, 'free' ,1, 'xcur' ,2, 'scur' ,3, 'cr' ,4, 'read' ,5, 'mrec' ,
6, 'irec' ,7, 'write' ,8, 'pi' ) state,
count (*) blocks
from  x$bh b, dba_objects o
where  b.obj = o.data_object_id
and  o.object_name =  'T2'
group  by  o.object_name, state
order  by  blocks  desc
注:实验的时候可以先执行
1
alter  system flush buffer_cache;

 

 
7.使用各种sql熟知buffer cache使用情况
1
2
select  distinct  object_name, dbarfil, dbablk  from  x$bh a, dba_objects b
where  a.obj=b.object_id  and  object_name= 'T2' ;
OBJECT_NAME             DBARFIL     DBABLK
-------------------- ---------- ----------
T2                            1      86184
T2                            1      86185
1
2
select  object_name, dbarfil, dbablk  from  x$bh a, dba_objects b
where  a.obj=b.object_id  and  object_name= 'T2' ;
Q:将buffer cache中占用buffer最多的对象给找出来?
A:
1
2
3
4
5
6
7
8
9
select
o.object_name,
decode(state,0, 'free' ,1, 'xcur' ,2, 'scur' ,3, 'cr' ,4, 'read' ,5, 'mrec' ,
6, 'irec' ,7, 'write' ,8, 'pi' ) state,
count (*) blocks
from  x$bh b, dba_objects o
where  b.obj = o.data_object_id  and  state<>0
group  by  o.object_name, state
order  by  blocks  asc ;
Q:寻找热块
A:
1
2
3
4
5
6
7
8
9
select
obj
object,
dbarfil
file#,
dbablk
block#,
tch
touches
from  x$bh
where  tch>10
order  by
tch  asc ;
    OBJECT      FILE#     BLOCK#    TOUCHES
---------- ---------- ---------- ----------
      5847          1      11752         29
      5834          1      11664         29
      5834          1      11665         29
      5832          1      11649         30
      5833          1      11657         30
      5834          1      11666         31
       287          1       2009         45
       287          1       2008         45
 
96 rows selected.
注:块被逻辑读的次数多,就是热端,根据块的tch属性判断。
1
2
select  object_name, dbarfil, dbablk  from  x$bh a, dba_objects b
where  a.obj=b.object_id  and  dbarfil=1  and  dbablk=287
Q:块的总数
A:
1
select  sum (blocks)  from  dba_data_files;
SUM(BLOCKS)
-----------
     176640
 
Q:查询当前空闲空间的比例,最好控制在10%以内
A:
1
2
3
select  decode(state,0, 'FREE' ,1,decode(lrba_seq,0, 'AVAILABLE' , 'BEING USED' ),3, 'BEING USED' , state)  "BLOCK STATUS" , count (*)
from  x$bh
group  by  decode(state,0, 'FREE' ,1,decode(lrba_seq,0, 'AVAILABLE' , 'BEING USED' ),3, 'BEING USED' ,state);

BLOCK STATUS                               COUNT(*)

---------------------------------------- ----------
BEING USED                                       74
AVAILABLE                                      5385
FREE                                          10696
Q:最浪费内存的前10个语句占所有的比例,建议控制在5%以内
A:
1
2
3
select  sum (pct_bufgets)  "Percent"
from  ( select  rank() over ( order  by  buffer_gets  desc as  rank_bufgets, to_char(100 * ratio_to_report(buffer_gets) over(), '999.99' )pct_bufgets  from  v$sqlarea)
where  rank_bufgets < 11;
Q:找出消耗物理I/O资源最大的SQL语句
A:
1
2
3
select  disk_reads, substr(sql_text,1,4000)
from  v$sqlarea
order  by  disk_reads  asc ;
Q:常见的操作系统命令,查看
A:
1
2
3
4
5
6
7
iostat  1  10
vmstat  1  10
mpstat  1  10
mpstat
-P 
0  1
mpstat
-P 
1  1
top
free
内存读:消耗CPU资源
物理读:消耗I/O资源