前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >相克军_Oracle体系_随堂笔记005-Database buffer cache

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

作者头像
Alfred Zhao
发布2019-05-24 20:29:59
6090
发布2019-05-24 20:29:59
举报

本章主要阐述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');

访问:

访问一个块,

一般情况下,一个块中有多个行(行链接,行迁移除外)。

2.buffer cache的意义:

①减少I/O:物理I/O,逻辑I/O

②构造cr块

引入undo:Oracle在修改数据以前,会将数据写到undo中。

undo的作用{

回滚未提交事物;

构造cr块。

}

这里会引出两个更深入的问题:①会话2如何知道会话1没有提交?②cr块如何从undo空间中找到被删除的那一行。

3.buffer cache的内存组织结构

CBC、LRU、LRUW、CHECKPOINT QUEUE

CBC 按照块地址将buffer链起来。

LRU 最近最少使用的顺序链起来。可用块~

LRU,MRU(最近最多使用)

LRUW 脏块的,DBWn以此为标准优先写最近最少使用的脏块。

CHECKPOINT QUEUE 也是关于脏块的,按块第一次脏的时间点链起来。

注:在Oracle中,一般都是采用双向的链。

4.DB_WRITER_PROCESSES

代码语言:javascript
复制
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的重要参数配置

代码语言:javascript
复制
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状态

代码语言:javascript
复制
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:

代码语言:javascript
复制
cr块被构造后被读出,就马上没意义了。。马上就可以被覆盖了。。
要修改一个块,只能修改current块。

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

A:

代码语言:javascript
复制
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

注:实验的时候可以先执行

代码语言:javascript
复制
alter system flush buffer_cache;

7.使用各种sql熟知buffer cache使用情况

代码语言:javascript
复制
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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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属性判断。

代码语言:javascript
复制
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:

代码语言:javascript
复制
select sum(blocks) from dba_data_files;

SUM(BLOCKS)

-----------

176640

Q:查询当前空闲空间的比例,最好控制在10%以内

A:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
select disk_reads, substr(sql_text,1,4000) 
from v$sqlarea 
order by disk_reads asc;

Q:常见的操作系统命令,查看

A:

代码语言:javascript
复制
iostat 1 10
vmstat 1 10
mpstat 1 10
mpstat -P 0 1
mpstat -P 1 1
top
free

内存读:消耗CPU资源

物理读:消耗I/O资源

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-07-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档