1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > oracle 表空间 碎片 Oracle表空间碎片整理

oracle 表空间 碎片 Oracle表空间碎片整理

时间:2024-03-22 08:14:36

相关推荐

oracle 表空间 碎片 Oracle表空间碎片整理

作为影响数据库性能的一个因素,数据库表空间碎片,应当引起DBA的重视,及时发现并整理碎片是DBA基本维护内容,以提高数据库性能。

Oracle数据库表空间、段、区、块简述

表空间(tablesapce)

表空间是数据库中的基本逻辑结构,一组数据文件的集合。一个表空间可以包含多个数据文件,但是一个数据文件只能属于一个表空间。

段(segment)

段是对象在数据库中占用的空间,虽然段和数据库对象是一一对应的,但段是从数据库存储的角度来看的。一个段只能属于一个表空间,一个表空间可以有多个段。

表空间和数据文件是物理存储上的一对多的关系,表空间和段是逻辑存储上的一对多的关系,段不直接和数据文件发生关系。一个段可以属于多个数据文件(段可以跨数据文件)。从dba_segments视图中,可以比较清楚看清数据段的结构。

常用的段可以分为以下四种:

数据段(Data Segment)

索引段(Index Segment)

回滚段(Rollback Segment)

临时段(Temporary Segment)

区间(Extent)

在一个段中可以存在多个区间,区间是为数据一次性预留的一个较大的存储空间,直到那个区间被用满,数据库会继续申请一个新的预留存储空间,即新的区间,一直到段的最大区间数(Max Extent)或没有可用的磁盘空间可以申请。区不可以跨数据文件。视图dba_extents(或者all_extents、user_extents)查看分区结构和存储构成。

数据块(Block)

Oracle最基本的存储单位,Oracle的操作都是以块为基本单位,一个区间可以包含多个块。块的大小在建立数据库时候指定,可以查看DB_BLOCK_SIZE参数,根据实际需要,设置为 4K、8K、16K、32K、64K等几种大小。

理想的情况是在表空间中有一个大的空闲区段(extent)。表空间中的空闲空间越多,就越有可能遇到碎片问题。free extent的大小也非常重要。如果有很多小区段(对于下一个区段大小太小),但是空闲空间的总字节数很大,那么可能需要考虑碎片整理。

表空间碎片的产生

一个段包含多个区的情况是普遍存在的,没有任何措施可以保证这些区是相邻存储的。当要满足一个空间分配要求时,数据库不再合并相邻的free space(除非别无选择),而是寻找表空间中最大的自由范围来使用。这样将逐渐形成越来越多的离散的、分隔的、较小的自由空间,即碎片。

表空间碎片的影响

1)导致系统性能减弱

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

2)浪费大量的表空间

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

查看表空间碎片的方法

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

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

FSFI的最大可能值为100(一个理想的单文件表空间)。随着范围的增加,FSFI值缓慢下降,而随着最大范围尺寸的减少, FSFI值会迅速下降。数字越小,表空间碎片较多,当小于30%的时候说明碎片程度严重,就需要做碎片整理了。

select a.tablespace_name,

sqrt(max(a.blocks) sum(a.blocks)) *

(100 / sqrt(sqrt(count(a.blocks)))) FSFI

from dba_free_space a, dba_tablespaces b

where a.tablespace_name = b.tablespace_name

and b.contents not in ('TEMPORARY', 'UNDO')

group by a.tablespace_name

order by 2;

2)dba_free_space 显示的是有free空间的tablespace,如果一个tablespace的free 空间不连续,那每段free空间都会在dba_free_space中存在一条记录。如果一个tablespace有好几条记录,说明表空间存在碎片,当采用字典管理的表空间碎片超过500就需要对表空间进行碎片整理。

SELECT a.tablespace_name, COUNT (1) 碎片量

FROM dba_free_space a, dba_tablespaces b

WHERE a.tablespace_name = b.tablespace_name

AND b.contents NOT IN ('TEMPORARY', 'UNDO', 'SYSAUX')

GROUP BY a.tablespace_name

HAVING COUNT (1) > 20

ORDER BY 2;

表空间的碎片整理

1)表空间的 pctincrease 值为非 0

对于ASSM管理的表空间,一般都是由smon(系统监控)进程自动整理,前提是表空间的pctincrease值为非0,可以将表空间的缺省存储参数pctincrease改为非0,一般将其设为1。如修改test表空间的pctincrease属性:alter tablespace test default storage(pctincrease 1); 这样就可以自动整理表空间级别的碎片整理了。

2)手工合并自由范围:

如果对于字典管理的表空间,可以用下面的命令进行整理:

sql> alter tablespace collesce;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。