炼数成金 门户 大数据 Oracle 查看内容

Oracle的表空间的存储管理与优化技术

2012-11-15 00:05| 发布者: 仙豆| 查看: 1121| 评论: 0|来自: 新浪博客

摘要: 原文地址:Oracle的表空间的存储管理与优化技术作者:我的真实转载自网络概述1、描述数据库的逻辑存储结构----表空间(TABLESPACE)2、描述字典管理表空间(DMT)的特性以及相应缺点3、描述字典管理表空间的优化方法 ...

数据库 管理 存储 Oracle RAC

转载自网络

概述

1、 描述数据库的逻辑存储结构----表空间(TABLESPACE

2、 描述字典管理表空间(DMT)的特性以及相应缺点

3、 描述字典管理表空间的优化方法

4、 描述本地管理表空间(LMT)的特性以及相应优点

5、 描述9i新的表空间类型以及相应优化

6、 描述段自动管理表空间的特点

7、 描述10g新的表空间的特点及相应优化

一、表空间的作用与分类

表空间是数据库中较大的逻辑存储结构,为数据库提供使用空间,其对应物理结构是数据文件,一个表空间可以包含多个数据文件,但是一个数据文件只能属于一个表空间。表空间所包含的数据文件的大小,也就决定了表空间的大小,所以,表空间也是逻辑结构连接到物理结构的一个纽带。


 

既然表空间为数据库提供使用空间,它就必须有自己的空间管理办法,在表空间中增加,删除段的时候,数据库就必须跟踪这些段空间的使用。

如下例所示,假定一个新创建的表空间包含了五个表

表一......表二......表三......表四......表五......未用空间

当我们删除表四的时候,就有如下结果

表一......表二......表三......空闲空间段......表五......未用空间

很明显,ORACLE需要有一个机制来管理表空间中各数据文件的这些分配的或未分配的空间,为了跟踪这些可以使用的空间(包括未分配使用的和可以重复使用的),对于每一个空间,我们必须知道:

1、这个可用空间位于什么数据文件

2、这个空间的尺寸是多大

3、如果它在用了,是哪一个段占用的这个空间

在空间的管理方式上,ORACLE推出了三种主要的空间管理方式,

一种是8i以前的字典管理方式(DMT),把可用空间和未用空间在数据字典中管理,ORACLE通过一个迭归SQL语句该字典表中请求空间。

另外一种就是8i以后的本地管理模式(LMT),本地管理模式完全放弃以前的管理方法,通过在数据文件的头部建立位图区域来管理空间的分配,在一定程度上避免了并发上的冲突;而且本地管理表空间通过存储上统一的空间管理并取消了为独立的段的NEXT存储参数,也解决了表空间一直以来头疼的碎片问题。

还有一种自动区段空间管理(ASSM)是9iR2推出的一种表空间级别的段空间管理模式,ASSM表空间是通过将SEGMENT SPACE MANAGEMENT AUTO子句添加到本地管理表空间的定义句法里而实现的。通过使用位图数组取代传统单向的链接列表(FREELIST),ASSM表空间会将链接列表的管理自动化,并取消为独立的段指定PCTUSEDFREELISTSFREELIST GROUPS存储参数。

注意:ASSM表空间一定就是LMT表空间

二、字典管理表空间

2.1 字典管理表空间的特性

8i以前(不包括8i),只存在一种表空间的管理模式,这就是字典管理表空间。

 主要语法:CREATE TABLESPACE 表空间名字

         DATAFILE '数据文件详细信息[SIZE INTETER [K|M]

|[DEFAULT STORAGE]|[PERMANENT|TEMPORARY]]

关键字DEFAULT STORAGE指明了该表空间的默认存储格式,包含了INITIALNEXTPCTINCREASE等相关参数的设置,如果创建在该表空间中的对象,不指明存储参数的话,将采用表空间的默认存储参数;PERMANENT|TEMPORARY指明了该表空间的类型是永久的还是临时的。

为了确保能保存以上空间分配的信息,ORACLE用了两个数据字典表:UET$(已使用的空间)和FET$(空闲空间)来保存表空间的空间使用与释放的信息,在涉及到空间分配的时候,ORACLE使用一个迭归SQL语句到该字典表中请求空间。

2.2 字典管理表空间的缺点

字典表空间由于本身的设计上的问题,存在如下缺陷

2.2.1 并发等待

查询UET$ FET$我们可以看到,每个已使用空间段或空闲空间段(不一定是一个extent,可以是多个extent)都在该表中对应了一行,如:

SQL> select * from UET$;

SEGFILE#  SEGBLOCK# EXT# TS#  FILE# BLOCK#   LENGTH

---------- ---------- ---------      ------     ----------  ----------    ----------

       127        0                       127          2

       109        0          0          1     109          4

       119        0          0          1     119          2

        42        0          0          1      42          2

       133        0          0          1     133         10

        51        0          0          1      51          2

        69        0          0          1      69         10

......

 

SQL> select * from FET$;

       TS#      FILE#     BLOCK#     LENGTH

---------- ---------- ---------- ----------

         1          2       1090         64

         1          2       2626        128

         2          3          2         99

         3          4         82          8

         3          4         74          8

......

它的工作方式是当建立一个新的段或者段在表空间中请求新的空间时,ORACLE通过一个迭归SQL语句来完成这个工作,移动或增加相应的行到UET$中,并改变相应FET$;当删除一个段的时候,ORACLE则移动UET$中相应的行到FET$。这个过程的发生是连续的、串行的,极可能发生等待。当并发性很高的时候,将产生数据字典的争用。

而且数据字典的表的信息发生改变,从而同时也使用了在系统表空间里的回滚段,引起空间争用,因为每一个字典改变的操作都需要记入系统回滚段,而且当一个段有几万或者几十万个区间的时候(对应字典表的几十万条记录),不用说管理该字典表的负担增加,就是对该段的drop操作都会变得异常国难,甚至导致系统回滚段空间不够而失败。

2.2.2 空间碎片

当段的空间很不连续或表空间有大量的碎片就会引起数据库性能上的下降。因为字典管理表空间没有任何措施可以保证段的所有区间是相邻存储的。当要满足一个空间要求时,数据库不再合并相邻的自由范围(除非别无选择), 而是寻找表空间中较大的自由范围来使用。这样将逐渐形成越来越多的离散的、分隔的、较小的自由空间,即碎片。随着时间推移,基于数据库的应用系统的广泛使用,产生的碎片会越来越多,将对数据库有以下两点主要影响:

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

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

2.3 字典管理表空间的优化

从以上一系列操作中,我们可以看到,UET$记录了任何使用的段的区间,如果区间数太多,将给表UET$的操作带来一定压力,所以在字典管理的表空间中,一般要求区间数少一点比较好,除非有特殊要求,一般建议在20个区间以下。还有一点就是如果发生连续的空间请求,将导致ORACLE在两个字典表之间的操作等待,对于并发性很高的数据库来说,这是一个高昂的操作,所以,我们可以采用预分配空间的方式,并不但的监控段的空间使用情况(大小,区间数),这样就可以在很大程度上解决并发处理带来的额外的代价。

在另外一个方面,我们可以指定在字典管理表空间中的所有段都具有PCTINCREASE=0的特性,保证每个区间的大小相等,然后可以设定每个区间的大小等于某一个特定数的整数倍,如= n*db_block_size* db_file_multiblock_read_count,这样可以在很大程度上防止表空间的碎片化。

三、本地管理表空间

3.1本地管理表空间的特性

Oracle8I的版本中,Oracle推出了一种全新的表空间管理方式:本地化管理的表空间。所谓本地化管理,就是指Oracle不再利用数据字典表来记录Oracle表空间里面的区的使用状况,而是在每个表空间的数据文件的头部加入了一个位图区,在其中记录每个区的使用状况。每当一个区被使用,或者被释放以供重新使用时,Oracle都会更新数据文件头部的这个记录,反映这个变化。

本地化管理的表空间的创建过程:

 主要语法:CREATE TABLESPACE 表空间名字

          DATAFILE '数据文件详细信息'

          [EXTENT MANAGEMENT { LOCAL

          {AUTOALLOCATE | UNIFORM [SIZE INTETER [K|M] ] } } ]

关键字EXTENT MANAGEMENT LOCAL 指定这是一个本地化管理的表空间。对于系统表空间,只能在创建数据库的时候指定EXTENT MANGEMENT LOCAL,因为它是数据库创建时建立的第一个表空间。

8i中,字典管理还是默认的管理方式,当选择了LOCAL关键字,即表明这是一个本地管理的表空间。当然还可以继续选择更细的管理方式:是自动分配(AUTOALLOCATE 还是 统一尺寸(UNIFORM.。若为自动分配,则表明让Oracle来决定区块的使用办法;若选择了统一尺寸,则还可以详细指定每个区间(Extent)的大小,若不加指定,则默认每个区使用1M大小。

在表空间的空间管理上,ORACLE将存储信息保存在表空间的头部的位图中,而不是保存在数据字典中。通过这样的方式,在分配或者回收空间的时候,表空间就可以独立的在数据文件头部完成操作而不用与其它对象打交道。

也因为仅仅操作数据文件头部几个块,不用操作数据字典,所以ORACLE在本地管理的表空间中添加,删除段的时候,效率要比字典管理的表空间快。特别是在并发性很强的空间请求中。

对于在本地管理的表空间内部创建的对象而言,NEXT扩展子句是过时的,因为由本地管理的表空间会自动管理它们。但是,INITIAL参数仍然是需要的,因为Oracle不可能提前知道初始段加载的大小。

在本地管理的表空间中,如果数据库块尺寸(db_block_size  16k16k以下,数据文件头是 64k 保留空间,若是32k的块尺寸,则保留 128k,以默认的8k的块大小而言,就是8个块用在数据文件头部用于系统消耗,其中的3~8


鲜花

握手

雷人

路过

鸡蛋

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

 

GMT+8, 2019-9-16 18:50 , Processed in 0.207283 second(s), 22 queries .