首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | linux相关 | linux认证 | 下载中心 | 专题
oklinux
 系统管理:中文环境 系统管理 桌面应用 内核技术 Linux基础:安装配置 常用命令 经验技巧 软件应用 Linux数据库:Mysql POSTGRE
 网络管理:网络安全 网络应用 Linux服务器 编程开发:PHP CC++ Python Perl SHELL 嵌入式开发 | PHP基础 PHP技巧 PHP应用 PHP文摘
 首页 linux资讯动态 Linux专题 | 其他Unix Linux解决方案 硬件相关 Linux认证 企业应用 Apache | 相关下载:资料 参考手册 服务器
 → 当前位置:首页>linux数据库>oracle>正文

深入探讨Oracle数据缓冲区内部机制

OKLinux www.oklinux.cn 2007-03-20 来源:oklinux收集整理 会员收藏 游客收藏

在本篇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。由于内存条的价格在持续下跌,现在只需要较小的或者不需要硬件投资就能够通过完全缓冲一个较小的数据库从而显著地提高性能。

上一篇:Oracle数据库中如何改善表空间的管理   下一篇:Oracle 10g数据库中闪回表特性剖析

收藏于收藏夹】 【评论】 【推荐】 【投稿】 【打印】 【关闭

相关文章
·Oracle数据库中如何改善表空间的管理
·Oracle 10g数据库中闪回表特性剖析
·关于Oracle进程结构及后台进程简介
·从应用程序着手优化Oracle数据库
·教你在Oracle中通过网络连接导入数据
·Oracle数据库中通过扩展SQL跟踪数据
·直接利用ALTER TABLESPACE修改大文件
·用Oracle 10g列值掩码技术隐藏敏感数据
·教你在Oracle数据库中建立透明网关环境
·SQL Server与Oracle并行访问本质区别
发表评论
密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。)
站内搜索
阅读排行榜
·如何修改遗失的MySQL的ROO
·教你如何将MySQL数据库的
·详解远程SHELL下安装配置R
·教你在MySQL从口令恢复设
·oracle9i installation on
·Oracle Instant 
·Oracle高级复制(同步复制)
·Linux下Oracle9i RMAN备份
·Linux下的Oracle数据库编
·Oracle的快照复制
最新文章
·Linux系统下Oracle9i RMAN
·详解远程SHELL下安装配置R
·用Linux系统命令完成Oracl
·Linux下的Oracle数据库编
·Linux下Oracle9i RMAN备份
·SQL Server与Oracle、DB2
·从黑客角度检验Oracle数据
·Oracle PL/SQL语言基础
·裸设备和Oracle问答20例
·Oracle中Decode()函数使用
·oracle中的sql语句
·ORACLE UNDO表空间释放过
·ORACLE FOR LINUX 安装指
·oracle监听不能启动的问题
·Oracle中的Merge函数

设为首页 - 加入收藏 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2007 All rights reserved OKLinux.Cn 版权所有