首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>linux数据库>oracle>正文

Oracle碎片整理全面解析

http://www.oklinux.cn  2007-04-19  来源: gurufl.com.cn david  会员收藏  游客收藏  【 】 
  
Oracle中的数据锁定机制分析

  Oracle 作为一种大型数据库,广泛应用于金融、邮电、电力、民航等数据吞吐量巨大,计算机网络广泛普及的重要部门。对于系统管理员来讲,如何保证网络稳定运行,如何提高数据库性能,使其更加安全高效,就显得尤为重要。作为影响数据库性能的一大因素 -- 数据库碎片,应当引起 DBA 的足够重视,及时发现并整理碎片乃是 DBA 一项基本维护内容。

  1、碎片是如何产生的

  当生成一个数据库时,它会 分成称为表空间( Tablespace )的多个逻辑段( Segment ),如系统( System )表空间 , 临时( Temporary )表空间等。一个表空间可以包含多个数据范围( Extent )和一个或多个自由范围块,即自由空间( Free Space )。

  表空间、段、范围、自由空间的逻辑关系如下:

  当表空间中生成一个段时,将从表空间有效自由空间中为这个段的初始范围分配空间。在这些初始范围充满数据时,段会请求增加另一个范围。这样的扩展过程会一直继续下去,直到达到最大的范围值,或者在表空间中已经没有自由空间用于下一个范围。最理想的状态就是一个段的数据可被存在单一的一个范围中。这样,所有的数据存储时靠近段内其它数据,并且寻找数据可少用一些指针。但是一个段包含多个范围的情况是大量存在的,没有任何措施可以保证这些范围是相邻存储的,如图〈 1 〉。当要满足一个空间要求时,数据库不再合并相邻的自由范围(除非别无选择), 而是寻找表空间中最大的自由范围来使用。这样将逐渐形成越来越多的离散的、分隔的、较小的自由空间,即碎片。例如:

  2、碎片对系统的影响

  随着时间推移,基于数据库的应用系统的广泛使用,产生的碎片会越来越多,将对数据库有以下两点主要影响:

  1)导致系统性能减弱

  如上所述,当要满足一个空间要求时,数据库将首先查找当前最大的自由范围,而 " 最大 " 自由范围逐渐变小,要找到一个足够大的自由范围已变得越来越困难,从而导致表空间中的速度障碍,使数据库的空间分配愈发远离理想状态;

  2)浪费大量的表空间

  尽管有一部分自由范围(如表空间的 pctincrease 为非 0 )将会被 SMON (系统监控)后台进程周期性地合并,但始终有一部分自由范围无法得以自动合并,浪费了大量的表空间。

  3、自由范围的碎片计算

  由于自由空间碎片是由几部分组成,如范围数量、最大范围尺寸等,我们可用 FSFI--Free Space Fragmentation Index (自由空间碎片索引)值来直观体现:

FSFI=100*SQRT(max(extent)/sum(extents))*1/SQRT(SQRT(count(extents))) 


  可以看出, FSFI 的最大可能值为 100 (一个理想的单文件表空间)。随着范围的增加, FSFI 值缓慢下降,而随着最大范围尺寸的减少, FSFI 值会迅速下降。

  下面的脚本可以用来计算 FSFI 值:

rem FSFI value Compute 
rem fsfi.sql 
column FSFI format 999,99 
select tablespace_name,sqrt(max(blocks)/sum(blocks))* 
(100/sqrt(sqrt(count(blocks)))) FSFI 
from dba_free_space 
group by tablespace_name order by 1; 
spool fsfi.rep; 

spool off; 


  比如,在某数据库运行脚本 fsfi.sql, 得到以下 FSFI 值:

TABLESPACE_NAME FSFI 
------------------------------ ------- 
RBS 74.06 
SYSTEM 100.00 
TEMP 22.82 
TOOLS 75.79 
USERS 100.00 
USER_TOOLS 100.00 
YDCX_DATA 47.34 
YDCX_IDX 57.19 
YDJF_DATA 33.80 
YDJF_IDX 75.55  


  ---- 统计出了数据库的 FSFI 值,就可以把它作为一个可比参数。在一个有着足够有效自由空间,且 FSFI 值超过 30 的表空间中,很少会遇见有效自由空间的问题。当一个空间将要接近可比参数时,就需要做碎片整理了。

  4、自由范围的碎片整理

  1)表空间的 pctincrease 值为非 0

  可以将表空间的缺省存储参数 pctincrease 改为非 0 。一般将其设为 1 ,如:

    alter tablespace temp 
    default storage(pctincrease 1); 


  这样 SMON 便会将自由范围自动合并。也可以手工合并自由范围:

alter tablespace temp coalesce; 


  5、段的碎片整理

  我们知道,段由范围组成。在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典 dba_segments ,范围的信息可查看数据字典 dba_extents 。如果段的碎片过多, 将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用 Import/Export (输入 / 输出)工具来完成。

  Export ()命令有一个(压缩)标志,这个标志在读表时会引发 Export 确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数 -- 等于全部所分配空间。若这个表关闭, 则使用 Import ()工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如:

    exp user/password file=exp.dmp compress=Y grants=Y indexes=Y 
    tables=(table1,table2);  


  若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表:

imp user/password file=exp.dmp commit=Y buffer=64000 full=Y 


  这种方法可用于整个数据库。

  以上简单分析了 Oracle 数据库碎片的产生、计算方法及整理,仅供参考。数据库的性能优化是一项技术含量高,同时又需要有足够耐心、认真细致的工作。 对数据库碎片的一点探讨,

  回复: ORACLE碎片整理[转帖]

  下面是一种如何自动处理表空间碎片的代码,希望对上大家看上文有用。

Coalesce Tablespace Automatically 
This technique comes from Sandeep Naik, a database administrator 
for GSXXI, Inc. in New York City, New York 
Here is a handy script which can be scheduled to automatically run 
and coalesces the tablespaces. 
This script is designed to run in NT but can be run in any operating system 
by slight modifications in the path where the file spools 
from the SQLPLUS environment. It assumes that the user who runs the script 
has priviledges to view the data dictionary. 
Start of code 
-------------------------------------- 
sqlplus / 
prompt this script will coalesce the tablespace automatically 
set verify off; 
set termout off; 
set head off; 
spool c: empcoalesce.log 
select alter tablespace ||TABLESPACE_NAME|| coalesce  
from DBA_FREE_SPACE_COALESCED where PERCENT_EXTENTS_COALESCED <100 
or PERCENT_BLOCKS_COALESCED<100  
spool off; 
@ c: empcoalesce.log 
set head on; 
set termout on; 
set verify on; 
prompt Tablespaces are coalesced successfully 
 

上一篇:Linux认证复习题100道(答案在最后)   下一篇:Oracle Spatial数据加密问题的研究


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·Oracle Spatial数据加密问题的研究
·用Oracle归档日志进行恢复的方法
·Oracle 维护redo日志
·Oracle数据库PL/SQL编码规则总结
·运用HINT提高SQL语句的执行效率
·Oracle Index 的三个问题
·全面剖析Oracle数据库中的分区功能
·Oracle Instant client介绍及试用手记
·Oracle下在线重定义表
·利用iptables防火墙保护Oracle数据库
·Oracle 数据库存储结构简介
·使用Oracle中的时间间隔型数据
·用智能优化器提高Oracle的性能
·如何快速转移Oracle中海量数据
·Oracle 9i 数据库移动过程
·Oracle DBA应该遵从的调优法则
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·实例讲解如何查找某个对象的定义情况
·讲解Oracle中JOB与存储过程的接合用法
·深入讲解"database link"的设置和使用
·讲解Oracle移动数据文件到新分区的过程
·如何使用Ruby脚本调用Oracle存储过程
·哪些因素可以影响Oracle数据库的性能
·带你深入了解Oracle数据库的进制转换
·讲解V$Datafile_Header相关字段的使用
·探讨基于不绑定变量与绑定变量的柱状图
·pl/sql developer中TIMESTAMP的显示格
·教你快速掌握如何使用"Opatch"打补丁
·如何调整"Oracle"数据库服务器的性能
  阅读排行
·如何修改遗失的MySQL的ROOT用户密码
·详解远程SHELL下安装配置RedHat ES 5的
·教你如何将MySQL数据库的密码恢复
·教你在MySQL从口令恢复设置的密码
·在 Oracle Enterprise Linux 上升级到
·oracle9i installation on fedora core
·Oracle Instant client介绍
·Oracle高级复制(同步复制)配置步骤详细
·用Oracle归档日志进行恢复的方法
·Linux下的Oracle数据库编程详解
·Linux下Oracle9i RMAN备份及恢复步骤介
·带你轻松接触一些比较常用的sql*plus命
·Oracle的快照复制
·Oracle 数据库存储结构简介
·Oracle HA 在Unix上双机环境的安装指南
网摘收藏: