一个oracle block与data buffer中的一个buffer对应。
用户进程(server process)负责读取磁盘上的block到data buffer cache中,DEWn进程负责将脏块写到磁盘上。
一个buffer在data buffer中有4种状态
pined:多个进程想写这个块,但只有1个进程能获得锁。
claen :buffer中的数据和磁盘上的数据时一致的,这些块将优先被淘汰。
free/unused:没有被使用过,是空白内容。
dirty:不被某个进程使用使用,但buffer的内容和磁盘内容不一致
data buffer cache中用2个队列保存buffer,一个队列是LRU list,按照每个buffer被访问的时间排序,最近访问的buffer排在最前。一个队列是checkpoint queue,保存脏块,DBWn进负责将这些脏块写到磁盘中。
建议将参数db_block_checksum设为true,为每个block添加一个校验码,防止磁盘损坏引起数据丢失。
data buffer cache由多个相互独立的buffer pool组成,每个buffer对应一个block,不同的block size对应不同的buffer pool。
db_block_size决定了default,recycle,keep池中每个buffer的大小。
db_cache_size:default池的大小。
db_recycle_cache_size:recycle池的大小。
db_keep_cache_size:keep池的大小。
也可通过设置SGA_TARGET,实现自动管理。
关于各data buffer cache大小的建议
select a.name,a.SIZE_FOR_ESTIMATE,a.ESTD_PHYSICAL_READ_FACTOR,a.ESTD_PHYSICAL_READS from
v$db_cache_advice a order by a.name,a.SIZE_FOR_ESTIMATE;
查看buffer cache的命中率
SELECT NAME, VALUE
FROM V$SYSSTAT
WHERE NAME IN ('db block gets from cache', 'consistent gets from cache', 'physical reads cache');
并使用公式1 - (('physical reads cache') / ('consistent gets from cache' + 'db block gets from cache')计算
或者在sql语句中直接计算
select 1-(sum(decode(name,'physical reads',value,0))/
(sum(decode(name,'db block gets',value,0))+
(sum(decode(name,'consistent gets',value,0)))))
from v$sysstat;
在多buffer pool情况下,分别统计不同buffer pool的命中率
select name,1-(physical_reads/(db_block_gets+consistent_gets))
from v$buffer_pool_statistics
where db_block_gets+consistent_gets>0;
命中率需要和等待事件结合起来看性能情况。
大表的全扫描会降低buffer cache的命中率
查看段在buffer cache中的占用情况,利用V$BH
方式一:查看每个段有多少个块在buffer cache中
SELECT o.OBJECT_NAME, COUNT(*) NUMBER_OF_BLOCKS
FROM DBA_OBJECTS o, V$BH bh
WHERE o.DATA_OBJECT_ID = bh.OBJD
AND o.OWNER != 'SYS'
GROUP BY o.OBJECT_NAME
ORDER BY COUNT(*);
方式二:查看指定段占用buffer cache的比率
1.获取段的object_id
SELECT DATA_OBJECT_ID, OBJECT_TYPE
FROM DBA_OBJECTS
WHERE OBJECT_NAME = UPPER('segment_name');
2.获取指定段占用了多少buffer
SELECT COUNT(*) BUFFERS
FROM V$BH
WHERE OBJD = data_object_id_value;
3.获取当前buffer cache中有多少个buffer
SELECT NAME, BLOCK_SIZE, SUM(BUFFERS)
FROM V$BUFFER_POOL
GROUP BY NAME, BLOCK_SIZE
HAVING SUM(BUFFERS) > 0;
4.利用第3步和第4步的结果就可以计算出该段在buffer cache中的占用情况。
对buffer cache调优的目标
server process能够在buffer cache中找到需要的数据
发生相应的等待事件的次数减少
调优的手段
降低sql语句对数据块的请求
增加buffer cache的容量
把不同访问模式的对方防到不同的pool中
将小表钉在内存中
直接读
主要事件
Free Buffer Inspected: server process为了在LRU链表上找到可用的内存数据块所所跳过的数据块的个数。
Free Buffer waits: server process通知DBWn写脏块的次数
Buffer busy waits: 找到buffer,但buffer被另一个进程占有,开始等待的次数。
000000000
查看Free Buffer Inspected产生的次数
select name,value from v$sysstat where name = 'free buffer inspected';
查看Free Buffer waits和Buffer busy waits发生的次数及耗用时间
select EVENT,TOTAL_WAITS,TIME_WAITED from v$system_event
where EVENT in('buffer busy waits','free buffer waits');
多个buffer pool
当对大表进行全表扫描时,可能会使其他buffer(温块)移除buffer pool,将这些大表设置使用recycle pool。
recycle pool的容量应小于default pool,recycle pool中的buffer应尽快移出。
将温块设置为使用keep pool。keep pool的容量应大于default pool。
alter table me.t_option storage(buffer_pool keep);
1个segment只能放在1个pool中。
v$cache,需要执行@?/rdbms/admin/catclust.sql脚本。与v$bh类型
select a.username,NAME,count(BLOCK#) from dba_users a join
v$cache b on a.USER_ID = b.owner#
where a.username != 'SYS'
group by OWNER#,a.username,NAME
order by a.username;
v$sess_io 记录了每个已连接session的读取情况的累计值
select b.USERNAME,a.BLOCK_GETS,a.CONSISTENT_GETS,a.PHYSICAL_READS
from v$sess_io a full join v$session b on a.SID=b.SID
where b.USERNAME is not null;
cache table
当使用全表扫描的方式查询一张表时,会将该表相应的buffer放在LRU list的末尾,以便尽快淘汰,但有些小表需要全表扫描而不希望被淘汰掉,这时就需要使用cache table将表对应的buffer放在LRU list的开头。可以通过创建表,修改表,和sql提示实现cache table。建议被cache table的表不要太多,并放到keep pool中。cache table只能延长buffer在buffer pool中的存活时间,而不能将buffer pin在buffer pool中。
可以在user_tables或all_tables或dba_tables中查询cache字段查看表是否被cache table。
Y :cache table N:没有被cache table
例:create table cache_test(id int) cache;
alter table cache_test cache;
配置多个DBWn进程
配置参数db_writer_processes
在多cpu,异步IO的OS上能显著提高性能。
参数disk_asynch_io是是否启用异步IO的开关 true:打开
什么时候需要增加DBWn进程?如果等待事件Free Buffer waits占有比较高比例时
分享到:
相关推荐
Oracle 性能调优之 Buffer Cache Buffer Cache 是 Oracle 中的一种缓存机制,负责将磁盘上的数据 block 读取到内存中,以提高数据库的访问速度。在本文中,我们将详细介绍 Buffer Cache 的工作原理、状态、管理和...
Oracle 调优总结 Oracle 调优是数据库管理员和开发人员日常工作中的一个关键部分。只有当数据库的性能达到最佳状态时,才能确保业务的顺利运行。下面总结了 Oracle 调优的一些关键点: 一、了解表结构和索引情况 ...
### Oracle数据库调优配置:两种方案详解 在企业级应用中,Oracle数据库因其稳定性和高效性而被广泛采用。然而,随着数据量的急剧增长和业务需求的不断变化,优化Oracle数据库性能成为确保系统高效运行的关键。本文...
### Oracle性能调优原理及具体手段 #### 一、Oracle结构与实例 ##### 1.1 Oracle实例(Instance) - **定义与作用**:Oracle实例是访问Oracle数据库的一个途径,它仅能打开一个数据库。 - **组成**:由SGA(系统...
本文主要关注Oracle的Shared Pool和Buffer Cache的调优。 首先,我们来看Shared Pool的调优。Shared Pool是Oracle SGA(System Global Area)的一部分,主要用于存储SQL语句、PL/SQL代码、数据字典信息等。其优化对...
本文主要关注Oracle性能优化中的关键领域——SGA(System Global Area)的调优,尤其是Shared Pool和Buffer Cache的优化。 **1. Shared Pool调优** Shared Pool是Oracle SGA的一部分,它主要负责存储解析的SQL语句...
Oracle性能调优是数据库管理中的关键任务,旨在提高数据库系统的响应速度和整体效率。以下是针对Oracle性能调优的详尽解析: 首先,调优的角色包括系统设计人员、系统开发人员、DBA(数据库管理员)以及操作系统...
Oracle数据库调优是一个复杂而重要的任务,涉及到多个层面,包括SQL查询优化、索引策略、内存管理、系统参数调整以及架构设计等。以下是对这些关键领域的详细解释: 1. **SQL查询优化**:Oracle SQL性能优化是调优...
本文档主要关注Oracle 9i及之前的版本,这些版本中的一些核心参数如`shared_pool_size`, `db_block_buffers`, `log_buffer`等对性能有显著影响。 1.1 Oracle 9i之前的内存参数调优: - **shared_pool_size**:用于...
Oracle 内存参数调优技术详解 Oracle 内存参数调优技术是指在 Oracle 实例中调整...基本掌握的原则是,db_block_buffer 通常可以尽可能的大,shared_pool_size 要适度,log_buffer 通常大到几百 K 到 1M 就差不多了。
为了提高SQL的执行效率,Oracle采用了共享缓冲区池(`shared buffer pool`)来缓存执行过的SQL语句及其结果。这意味着当执行一条与之前相同的SQL语句时,Oracle可以直接从缓存中获取结果,从而大大减少了执行时间。...
2. SHARED_POOL_SIZE:共享池包含PL/SQL代码、数据字典信息和解析的SQL语句,与Buffer Cache密切相关,需保持适当比例。 3. PCTFREE 和 PCTUSED:用于控制数据块的空闲空间,防止数据块过早分裂,影响Buffer Cache的...
### Oracle性能调优:内存参数调优技术详解 #### 一、Oracle内存结构与优化 在Oracle数据库系统中,为了确保高效稳定的数据处理能力,合理配置内存参数是至关其性能的关键因素之一。本文将深入探讨Oracle数据库...
Oracle 系统调优详解 Oracle 系统调优是指在 Oracle 数据库系统中,通过调整初始化参数以提高系统性能和稳定性。在 Oracle 8i 及以前的版本中,这些初始化参数记录在 INITsid.ora 文件中;而 Oracle 9i/10g/11g ...
- **BUFFER_POOL_KEEP** 和 **BUFFER_POOL_RECYCLE**:未显示具体设置,但在高并发查询场景下,可以启用这些功能以提高缓存命中率。 - **BITMAP_MERGE_AREA_SIZE**:当前值为1MB,对于大量位图索引操作的情况,可能...
《Oracle_IO_性能调优手册》是一本专为IT专业人士准备的深度指南,主要关注如何优化Oracle数据库的I/O性能。在Oracle数据库管理中,I/O性能是影响系统整体效率的关键因素,尤其对于大规模数据处理和高并发业务场景至...