如何通过Oracle的缓冲区内部机制调整性能

在本篇Oracle高级教程里,我会探讨Oracle数据缓冲区的内部机制——Oracle用这一内存来防止不必要的数据块从磁盘重读。理解Oracle数据缓冲区如何操作,是成功地运用它们调整数据库性能的关键。

在Oracle 8i以前的版本里,当数据块被从磁盘送进数据缓冲区的时候,数据块会被自动地放置到最近使用过的数据列表的前部。但是,这种行为从Oracle 8i开始就变了:新数据缓冲区被放置在缓冲区链的中部。在调节数据库的时候,你的目标就是为数据缓冲区分配尽量多的内存,而不会导致数据库服务器在内存里分页。数据缓冲区每小时的命中率一旦低于90%,你就应该为数据块缓冲区增加缓冲区。

数据块的存活时间

在调入数据块之后,Oracle会不停地跟踪数据块的使用计数(touch count,也就是说,这个数据块被用户线程所访问的次数)。如果一个数据块被多次使用,它就被移动到最近使用过的数据列表的最前面,这样就能确保它会在内存里保存一段较长的时间。这种新的中点插入技术会确保最常使用的数据块被保留在最近使用过的数据列表的最前面,因为新的数据块只有在它们被重复使用的时候才会被移动到缓冲区链的最前面。

总而言之,Oracle 8i数据缓冲池的管理要比先前的版本更加有效。通过将新的数据块插入缓冲区的中部,并根据访问活动(频率)调整缓冲区链,每个数据缓冲区就被分割成两个部分:热区(hot section),代表数据缓冲区的最近使用的一半;冷区(cold section),代表数据缓冲区的最早使用的一半。只有那些被反复请求的数据块才会被移进每个缓冲池的热区,这就让每个数据缓冲区在缓冲常用数据块的时候效率更高。

热区的大小要用下面的隐藏参数来配置:

_db_percent_hot_default
_db_percent_hot_keep
_db_percent_hot_recycle

Oracle公司作为官方没有推荐更改这些隐藏参数。只有懂得内部机制和希望调节其数据缓冲区行为的有经验人员才应该使用这些参数。

找到热数据块

Oracle 8i保留着一个X$BH内部查看表,用来显示数据缓冲池的相对性能。X$BH查看表有下列数据列:

Tim:两次使用之间的时间差,和_db_aging_touch_time参数相关。

Tch:使用计数,它和被使用过_db_aging_hot_criteria次之后从冷区移入热区直接相关。

由于Tch数据列用来追踪特定数据块的使用次数,所以你就能够编写一个字典查询来显示缓冲区里的热数据块——使用计数大于10的数据块,就像下面这样:

SELECT
obj object,
dbarfil file#,
dbablk block#,
tch touches
FROM
x$bh
WHERE
tch > 10
ORDER BY
tch desc;

这项高级查询技术在用于追踪DEFAULT缓冲池里的对象时尤其有用。一旦定位了热数据块,你就能够把它们从DEFAULT缓冲池移动到KEEP缓冲池。

完全缓冲数据库

从Oracle 8i开始,随着64位寻址的出现,你就能够创建一个完全在数据缓冲区里缓冲的数据库。现今,任何数据库通常只用不到20G的内存就能够被完全缓冲,而更大的数据库仍然需要部分数据缓冲区。

要利用完全数据缓冲的优势,就要记住从内存取回数据块和从磁盘取回数据块的时间差。对磁盘的访问时间是以毫秒或者说千分之一秒来计算的,而内存的速度是以纳秒或者说十亿分之一秒来计算的。因此内存的访问速度要快三个数量级,即通常要比磁盘的访问速度块将近14,000倍。

在完全缓冲Oracle数据库的时候,你需要仔细制定缓冲的规划,并在需要的时候增加db_block_ buffers参数的值。在缓冲整个数据库的时候,多数据缓冲池就不再需要了,所以你可以在DEFAULT数据池里缓冲所有的数据块。

如果要计算已分配数据块的数量,就要用下面的命令:

select
sum(blocks)
from
dba_data_files;

SUM(BLOCKS)
-----------
243260

select
sum(blocks)
from
dba_extents;

SUM(BLOCKS)
-----------
321723

已使用数据块的真实数量要通过查看DBMS_ROWID以获得真实的数据库地址来确定,就像下面这样:

select
sum(blocks)
from
dba_data_files;

 

随着数据库的扩展,你必须不忘增加参数的值。在数据库的启动阶段,你需要调用一个脚本加载缓冲区,这一步很简单,就像执行select count(*) from xxx;这样的命令,因为数据库里所有表格都会起作用。这就确保所有的数据块都被缓冲,从而大幅提高读取操作的性能。但是,写操作仍然会需要磁盘I/O。由于内存条的价格在持续下跌,现在只需要较小的或者不需要硬件投资就能够通过完全缓冲一个较小的数据库从而显著地提高性能。

时间: 2024-08-16 18:59:47

如何通过Oracle的缓冲区内部机制调整性能的相关文章

Microsoft SQL Server 查询处理器的内部机制与结构

摘要:本文介绍了在客户机上处理 Microsoft SQL Server 查询的方式,各种客户机与 SQL Server 的交互方式,以及 SQL Server 在处理客户机程序的请求时需要完成的工作. 简介 Microsoft(R) SQL Server(TM) 内部机制和结构是一个非常大的主题,因此本文仅限于程序开发人员感兴趣的问题,集中研究其他源中没有彻底讨论的问题.在讨论 SQL Server 的结构时,我们主要观察客户机的处理过程,研究不同的客户机程序与 SQL Server 的交互方

浅谈ASP.NET内部机制(六)

前言:大家都听说过也用过ASP.NET中的视图ViewState,到底ViewState本质上到底是什么东西?为什 么ASP.NET中没有他不行?下面就来谈谈... 我们一般在开发面向对象程序的时候,我们都是用对象保存数据的,比如用对象的属性,字段来保存 对象的状态.当调用对象的方法时,就可以改变对象的状态.释放对象后,对象的状态就消失.这点大家 都熟悉.在开发桌面程序的时候,没有什么问题,以为对象都一般在本地的内存中,直到不再用那个对象 ,我们就销毁它.但是在Web程序中,问题就大了,比如我们

数据-利用mysql内部机制执行运算问题

问题描述 利用mysql内部机制执行运算问题 mysql有没有这样的一种机制,我想用前一条数据的结果,然后插入一条新的数据:例如我这个表里有四个字段,分别是idcount0count1count2:我先查询到的前一条数据内容分别是id=1count0=1count1=2count2=3;然后我要插入一条id=2新的数据count0和count1分别加1,count2不变(id=2count0=2count1=3count2=3);如果按一般的思路,我先要查询id=1的数据,获取count0cou

微网站-微信公众平台内部接口调整,以前写的代码用不了了,有懂这一块的高手帮帮忙吧

问题描述 微信公众平台内部接口调整,以前写的代码用不了了,有懂这一块的高手帮帮忙吧 近几日微信公众平台内部接口调整主要有: 1.自定义菜单生成验证方式改变,部分用户生成自定义菜单会有curl_35问题 2.公众平台不再接受一键拨号类的tel:协议,含有此类自定义菜单的一律不通过,表现为生成的时候出现:sub button url..... 就是提示自定义菜单中不能含有一键拨号类信息 3.url和token绑定的时候验证时间缩短,导致部分服务器本身反映不够快的客户url超时 以前写的代码用不了了,

腾讯内部架构调整传言终于尘埃落定

本报讯 (记者徐晶卉)腾讯内部架构调整传言终于尘埃落定.腾讯日前对外宣布将现有业务重新划分成6大企业发展事业群.从调整方案看,将重点布局社交.游戏.网媒.无线.电商和搜索六大业务,强化平台战略. 记者了解到,腾讯已先后投资了上海最大的3C电商易迅网.珂兰钻石等一批B2C电商企业,有确切消息称,5月底,当当网也将入驻腾讯电商平台.另据内部人士透露,腾讯会将"微信"产品提升到与QQ相同的高度,全力拓展无线互联网领域.

移动App性能测评与优化1.3.1 Dalvik Heap内部机制

1.3.1 Dalvik Heap内部机制 为了弄清楚为什么DVM占着内存不释放,我们阅读了DVM分配内存部分的代码.位置在Android源码的dalvik/vm/alloc下,约255KB.分析的主要流程如下: 1)DVM使用mmap系统调用从系统分配大块内存作为Java Heap.根据系统机制,如果分类的内存尚未真正使用,就不计入PrivateDirty和Pss.例如图1-8所示,Heap Size/Alloc很多,但大部分是共享的,实际使用的较少.所以反映到PrivateDirty/Pss

hbase 协处理内部机制?

问题描述 hbase协处理内部机制?能不能直接用配置生成索引表? 解决方案 解决方案二:没人知道吗?给个答案啊!

javascript instanceof 内部机制探析_javascript技巧

比如: 复制代码 代码如下: // 代码 1 function Pig() {} var pig = new Pig(); alert(pig instanceof Pig); // => true function FlyPig() {} FlyPig.prototype = new Pig(); var flyPig = new FlyPig(); alert(flyPig instanceof Pig); // => true 来看另一段代码: 复制代码 代码如下: // 代码 2 fu

微信成为独立事业群,腾讯完成最大内部架构调整

摘要 : 要是我们站在某种角度,我们就会发现,微信事业群与腾讯其他六大事业群的关系,其实和百度的前向和搜索划分非常的相像. 在2014年的5月6日晚,腾讯公司方面正式宣布撤销其电商的业务,而与此同时,微信将会单独的成立事业群. 一升一降的表面下,昭示着腾讯在继MIG解体后终于完成最大内部架构调整. 做得好的业务:微信,被腾讯提升到了空前未有的战略高度;而做的差的业务:腾讯电商,被撤销的同时可怜连个名号都没留下. 当我们在感叹小马哥奖惩的果决之时,在经历过腾讯这次调整的背后,其实在内里还有着很多好