本章主要阐述SGA中的Database buffer cache。
Buffer cache {
1.pin (读写瞬间的状态)
2.clean
3.dirty
4.unused(free)
}
--Database buffer cache
概述:
1.段、区、块的概念:
create table t2 (
id int,
name varchar2(30)
);
建立一个表,同时建立一个段,
建立段的同时,会给段分配一个区,
区是物理上连续的几个块。
区是oracle给段分配的最小单位。
块是oracle I/O的最小单位。
数据以一行一行的形式存在块中。一般不会出现一个行出现在多个块中,也有例外
insert into t2 values(1,'xiaobei');
创建表时首先分配一个区,包含8个块,属于t2段,当第一个区用完了,会再分配一个区,用完后又会分配一个区给t2段空间中。
DBF文件中叫一个一个块,当这个块加载到内存中时,在内存SGA的buffer cache中,叫一个buffer
访问:
访问一个块,
一般情况下,一个块中有多个行(行链接,行迁移除外)。
SYS AS SYSDBA@ORCL>show parameter block;
NAME TYPE VALUE
------------------------------------ --------------------------------------------------
db_block_buffers integer 0
db_block_checking string FALSE
db_block_checksum string TYPICAL
db_block_size integer 8192#8k
db_file_multiblock_read_count integer 22
2.buffer cache的意义:
缓存DBF文件,减少物理I/0,
①减少I/O:物理I/O,逻辑I/O
(物理I/O:块从磁盘到内存的过程,磁盘读。逻辑I/O:块直接在内存中找到,内存读)
②构造cr块
一个会话在没有commit以后,其它会话的用户是无法看到的
Rollback后,将取消修改的数据,在undo内将修改前的数据恢复过来
只要未提交,就可以回滚数据
只要未提交,别的会话就看不见修改后的数据
引入undo:Oracle在修改数据以前,会将数据写到undo空间中。
undo的作用{
1.回滚未提交事物;
2.构造cr块。在buffer cache中构造CR块
}
这里会引出两个更深入的问题:①会话2如何知道会话1没有提交?②cr块如何从undo空间中找到被删除的那一行。
3.buffercache的内存组织结构:
内存通过chain(链)来组织和管理buffer。数据查找方式为:先找到链的头部,再从链的开头一直往下找(遍历),直到找到数据块(BUFFER)为止。
链:分为单向链和双向链
特点:一个数据块可以有多种链,多种链可以按不同的功能来划分。
CBC、LRU、LRUW、CHECKPOINT QUEUE
CBC(cache buffer chain)链: 所有的链按照块地址将buffer cache 中所有的buffer链起来。具体是根据block地址找block的时候,需要使用CBC chain
何时用到:根据块地址找buffer时用到
CBC链实现原理:
首先oracle在内存初始化时,将buffer cache划分为许多空链,和许多buffer(内存块),当一条sql语句来查buffer cache时,通过计算sql将得出要到那个链地址上去查,因为这时链地址并没有实际的数据(buffer),返回空,这时server process将会去硬盘中查找这条sql语句对应的块,并将这个数据块复制到内存的buffer中,并将这个块的头部地址挂到CBC链上面。以后如果还有同样的查询,server process将直接通过查看CBC链的块地址,就可以找到块地址对应的buffer(数据块)。
LRU(last resent used): 最近最少使用 最近最少使用的顺序链起来。可用块~。
何时用到:在将数据块从磁盘中调到buffer cache中时会用到
Buffer的状态:free clean dirty pinned。当数据库运行后几乎没有free块,大部分都是clean和dirty块。LRU就是通过对clean链的使用频率来决定数据块的存放位置。
原理:当buffer cache中没有可用的free块时,这时就可以将clean块移出buffer cache,要移出那个clean块,就是通过LRU的算法来进行的。LRU算法将所有的clean块按使用频率从少到多的顺序在逻辑到连接起来。所以越少使用的块,就会被越早从buffer cache中移出 。
MRU(最近最多使用):原理与LRU相反,所有链上是存放最多使用的块。
LRUW最近最少使用的脏块,按脏块被脏的频率来链接起来的
DBWn以此为标准优先写最近最少使用的脏块。
何时用到:DBWn在判断那些buffer块要刷新到磁盘时用到。
CHECKPOINT QUEUE:检查点队列 也是关于脏块的,按块第一次脏的时间点链起来。
注:在Oracle中,一般都是采用双向的链。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
buffer_cache大小的设置及依据:
4.DB_WRITER_PROCESSES
SQL> show parameter writer
NAME TYPE VALUE
------------------------------------ -----------------------------------------
db_writer_processes integer 1
SQL> alter system set db_writer_processes = 2scope=spfile;
--DBWn数量一般设定是服务器核心数/8.
SYS ASSYSDBA@ORCL>startup force;
ORACLE instance started.
Total System Global Area 422670336 bytes
Fixed Size 1336960 bytes
Variable Size 369101184 bytes
Database Buffers 46137344 bytes
Redo Buffers 6094848 bytes
Database mounted.
Database opened.
SYS AS SYSDBA@ORCL>show parameter writer;
NAME TYPE VALUE
------------------------------------ --------------------------------------------------
db_writer_processes integer 2
ps �Cef | grep ora
oracle 2429 1 0 08:33 ? 00:00:00 ora_dbw0_ORCL
oracle 2431 1 0 08:33 ? 00:00:00 ora_dbw1_ORCL
5.buffer cache的重要参数配置
查看SGA相关池的大小:
SYS AS SYSDBA@ORCL>selectcomponent,current_size,min_size from v$sga_dynamic_components;
COMPONENT CURRENT_SIZE MIN_SIZE
-------------------- ------------ ----------
shared pool 209715200 209715200
large pool 4194304 4194304
java pool 4194304 4194304
streams pool 4194304 4194304
DEFAULT buffer cache46137344 46137344
KEEP buffer cache 0 0
RECYCLE buffer cache 0 0
DEFAULT 2K buffer ca 0 0
che
DEFAULT 4K buffer ca 0 0
che
DEFAULT 8K buffer ca 0 0
che
DEFAULT 16K buffer c 0 0
ache
DEFAULT 32K buffer c 0 0
ache
Shared IO Pool 0 0
ASM Buffer Cache 0 0
14 rows selected.
Elapsed: 00:00:00.04
配置buffercache大小:
alter system set db_cache_size=200m scope=both;
设置大小顺序:
sga_max_size altersystem set sga_max_size=400M scope=spfile
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的大小
SYS AS SYSDBA@ORCL>select size_for_estimate"Cache Size (MB)",size_factor,buffers_for_estimate"Buffers", estd_physical_read_factorest_read_factor,estd_physical_reads estd_phy_red,estd_physical_read_time est_phy_red_tfrom v$db_cache_advice where NAME='DEFAULT' AND block_size=(SELECT VALUE FROMv$parameter WHERE NAME='db_block_size');
Cache Size (MB) SIZE_FACTOR Buffers EST_READ_FACTOR ESTD_PHY_REDEST_PHY_RED_T
--------------- ----------- ---------- --------------------------- -------------
4 .0909 496 1.2956 13356 0
8 .1818 992 1.1398 11750 0
12 .2727 1488 1.1086 11428 0
16 .3636 1984 1.0944 11282 0
20 .4545 2480 1.0614 10942 0
24 .5455 2976 1.034 10659 0
28 .6364 3472 1.0236 10552 0
32 .7273 3968 1.0113 10426 0
36 .8182 4464 1.0038 10348 0
40 .9091 4960 1.0009 10319 0
44 1 5456 1 10309 0
48 1.0909 5952 .9962 10270 0
52 1.1818 6448 .9953 10260 0
56 1.2727 6944 .9953 10260 0
60 1.3636 7440 .9953 10260 0
64 1.4545 7936 .9953 10260 0
68 1.5455 8432 .9953 10260 0
72 1.6364 8928 .9953 10260 0
76 1.7273 9424 .9953 10260 0
80 1.8182 9920 .9953 10260 0
根据语句查询buffer cache该设置多大合适。减少I/O(物理读次数)
平日注意收集积累一些常用的语句》。
6.Block(buffer内存中)状态
buffer header:
x$bh:表中每一行的数据对应buffercache中的一个buffer
SQL> desc x$bh
数据块的各种状态如下:
state:0~8
free:no valid block image(空闲的块,在buffer中没有被修改,与磁盘的数据一样)
XCUR:a currentmode block,exclusive to this instance
当一个实例对应一个数据库时(非RAC环境下),一个current对应一个xcur
SCUR:a current mode block,shared with other instance
当多个实例对应一个数据库时(RAC环境下),一个currnet有XCUR和SCUR两种状态
CR:a consistent read(stale) block image
当一个块被修改时,这时另一个server process也要读取这个块时,系统会构造CR块,来避免读到未提交的信息。
READ:buffer is reserved for a block being read from disk
从block写入buffer的那个过程
MREC:a block in media recovery mode
在备份恢复时会有的状态
IREC:a block in instance (crash) recovery mode
在备份恢复时会有的状态
write
数据块从内存的buffer中写入磁盘文件的过程
pi
SQL> select distinct state from x$bh;
非RAC环境下,current永远等于xcur。
RAC下,有scur |
|