暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

字典管理表空间

原创 不吃草的牛_Nick 2022-07-02
526

在Oracle 8i以前(不包括8i),只存在一种表空间的管理模式,这就是字典管理表空间(Dictionary Managed Tablespace,简称DMT)。之前创建表空间的主要语法为:

CREATE TABLESPACE tablespace_name
DATAFILE 'datafile_path_name' [SIZE INTETER [K|M] |[DEFAULT STORAGE] |[PERMANENT|TEMPORARY]];

这里关键字DEFAULT STORAGE指明了该表空间的默认存储格式,包含了INITIAL、NEXT、PCTINCREASE等相关参数的设置。如果在表空间中创建对象(如表、索引等)时不指定存储参数的话,Oracle将采用表空间的存储参数作为对象的默认参数;PERMANENT|TEMPORARY指明了该表空间的类型是永久的还是临时的。

当表空间被创建之后,可以通过查询dba_tablespaces视图来确定表空间的类型:

select tablespace_name, extent_management,allocation_type from dba_tablespaces;


EXTENT_MANAGEMENT显示为DICTIONARY的就是字典管理表空间。所谓字典管理表空间是指,当创建或删除对象时,Oracle的空间分配或回收是通过数据库中的数据字典表来记录和管理的,用于管理的两个数据字典表分别是:UET$(used extents-已使用的空间)和FET$(free extents-空闲空间)。

可以清晰地看到,这两个字典表基本上是通过文件号(file#)、数据块号(block#)等信息来管理空间的分配和回收的。

字典管理表空间的工作方式是——当建立一个新的段或者段在表空间中请求新的空间时,Oracle通过执行一系列的SQL语句来完成这个工作,这些工作包括从FET$中找到可用的自由空间,移动或增加相应的行到UET$中,并在FET$中删除相应的记录;当删除一个段的时候,Oracle则移动UET$中相应的行到FET$。

这个过程的发生是连续的、串行的,在繁忙的数据库中,这类操作极可能导致竞争和等待,产生数据字典的争用;另一方面,当数据字典的表的信息被修改时,系统同样要记录undo和redo信息,频繁的修改又不可避免地对整个数据库的性能产生影响。

在繁忙的数据库中,字典管理的表空间可能会成为灾难。


字典管理表空间面临的另外一个严重问题是:空间碎片。

在字典管理表空间中,我们经常会遇到这样的悖论,一个表空间中的自由空间(可以通过dba_free_space视图来计算)还有几百MB,但是一个请求几百KB空间的表可能都已经无法扩展。这是因为表空间中的自由空间并不连续,每块自由空间都很小,已经不能满足一个表的扩展需要,这在Oracle 8的年代常常成为困扰DBA的难题。

在字典管理表空间中,当要满足一个空间要求时,数据库要寻找表空间中的自由空间来使用,如果自由空间大于请求空间,那么自由空间就将被细分,这样将逐渐形成越来越多的离散的、分隔的、小块的自由空间,即空间碎片。
随着时间推移,应用系统的广泛使用,数据中所产生的碎片也会越来越多,这些碎片将对数据库产生以下几点主要影响:
★ 导致系统性能衰减,如上所述,当要满足一个空间扩展要求时,数据库将首先查找当前最大的自由空间,经过分割,自由空间将逐渐变小,要找到一个满足扩展需求的自由空间已经变得越来越难,从而导致空间分配中的速度问题。
★ 大量空间被浪费,尽管有一部分自由空间(如表空间的PCTINCREASE设置为非0值)将会被SMON(系统监控)后台进程周期性地合并,但始终有一部分自由空间无法得以自动合并,从而浪费了大量的宝贵空间,并且非0的PCTINCREASE更容易导致更多的碎片。
★ 空间释放成为难题,在DMT管理的表空间中,你也许听说过DROP一个大表或删除一个表空间往往要花费数十小时甚至几天的时间,同时会导致严重的性能问题。这是因为当需要删除一个表或表空间时,Oracle同样要维护其空间分配,这样fet$和uet$表同样要被维护,这样的维护耗时将超乎想象。

这里简单地引用一个维护字典管理表空间的案例,以便给大家一些直观的印象。在以下的案例中,我们需要删除一个字典管理的表空间,在删除表空间时,Oracle需要递归地删除表空间里所有的Extent,包括使用的和未使用的。下面以fet$为例,ts#=3的是目标表空间,在fet$中存在44万左右的Extents:
select ts#,count(*) from fet$ group by ts#;
TS# COUNT(*)
---------- ----------
0 817
1 12160
3 440932
4 15775
5 5300
6 314997

在DROP表空间时,可以反复查询这个视图,根据Extent减少的速度来评估Oracle完成删除所需要的时间。在这个案例中,Oracle每秒仅能清除3个Extent。

那么完成这个操作大约需要40多个小时,可以看到,这个时间消耗是相当惊人的:

SQL> select 440932/3/3600 from dual;
440932/3/3600
-------------
40.827037

最终Oracle认识到字典表空间已经成为影响数据库性能的严重问题,于是Oracle在Oracle 8i中开始引入了本地管理表空间(Local Management Tablespace)的技术。








「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论