程序员人生 网站导航

存储空间管理

栏目:数据库应用时间:2016-07-21 09:02:06
数据库的逻辑结构中,表空间将不同类型的数据分别组织在1起,如系统数据、用户数据、临时数据、回滚数据等。
在同1个表空间中,数据以数据库对象为单位组织在1起,1般情况下1个数据库对象对应1个段,1个表空间中包括多个段。
在段中存储数据库对象中的数据,数据所占用的存储空间以区为单位进行分配和回收。

1个数据库对象占用若干个区,所以段是由若干个区组成的。
当为数据库对象分配存储空间时,1次分配1个或多个区。
区是分配和回收存储空间的基本单位,1个区是由若干个连续的数据块组成的。
数据块是逻辑结构中的最小存储单位,是Oracle读写数据的基本单位。

当用户访问数据时,服务器进程首先将数据从数据块读到数据库高速缓存中,并存储在与数据块大小相同的缓冲区中,然后在缓冲区中对数据进行读写。
数据库中的数据在物理上是存储在磁盘上的,需要占用1定的操作系统块。

1个数据块是由若干个操作系统块组成的,因此,数据块的大小是操作系统块的整数倍。
数据库服务器对数据块的读写终究将转化为对多个操作系统块的读写。

段的管理
在表空间中,1个段1般代表1个数据库对象,对象的所有数据都存储在对应的段中。
1般情况下段不需要用户自己创建,在创建数据库对象将自动产生段。
为段所分配的空间就位于表空间的数据文件中,这些存储空间由若干个区组成。
段、区和数据块之间的关系如图所示。


段的类型
Oracle 11g支持10余种类型的段。
通过查询数据字典dba_segments ,可以得到当前数据库中已存在的段类型。
下面是有关数据字典dba_segments的相干信息:
DBA_SEGMENTS describes the storage allocated for all segments in the database.
Related View
USER_SEGMENTS describes the storage allocated for the segments owned by the current user's objects. This view does not display the OWNER, HEADER_FILE, HEADER_BLOCK, or RELATIVE_FNO columns.
Column Datatype NULL Description
OWNER VARCHAR2(128)   Username of the segment owner
SEGMENT_NAME VARCHAR2(128)   Name, if any, of the segment
PARTITION_NAME VARCHAR2(128)   Object Partition Name (Set to NULL for nonpartitioned objects)
SEGMENT_TYPE VARCHAR2(18)   Type of segment:
  • NESTED TABLE
  • TABLE
  • TABLE PARTITION
  • CLUSTER
  • LOBINDEX
  • INDEX
  • INDEX PARTITION
  • LOBSEGMENT
  • TABLE SUBPARTITION
  • INDEX SUBPARTITION
  • LOB PARTITION
  • LOB SUBPARTITION
  • ROLLBACK
  • TYPE2 UNDO
  • DEFERRED ROLLBACK
  • TEMPORARY
  • CACHE
  • SPACE HEADER
  • UNDEFINED
SEGMENT_SUBTYPE VARCHAR2(10)   Subtype of LOB segment: SECUREFILE, ASSM, MSSM, andNULL
TABLESPACE_NAME VARCHAR2(30)   Name of the tablespace containing the segment
HEADER_FILE NUMBER   ID of the file containing the segment header
HEADER_BLOCK NUMBER   ID of the block containing the segment header
BYTES NUMBER   Size, in bytes, of the segment
BLOCKS NUMBER   Size, in Oracle blocks, of the segment
EXTENTS NUMBER   Number of extents allocated to the segment
INITIAL_EXTENT NUMBER   Size in bytes requested for the initial extent of the segment at create time. (Oracle rounds the extent size to multiples of 5 blocks if the requested size is greater than 5 blocks.)
NEXT_EXTENT NUMBER   Size in bytes of the next extent to be allocated to the segment
MIN_EXTENTS NUMBER   Minimum number of extents allowed in the segment
MAX_EXTENTS NUMBER   Maximum number of extents allowed in the segment
MAX_SIZE NUMBER   Maximum number of blocks allowed in the segment
RETENTION VARCHAR2(7)   Retention option for SECUREFILE segment
MINRETENTION NUMBER   Minimum retention duration for SECUREFILE segment
PCT_INCREASE NUMBER   Percent by which to increase the size of the next extent to be allocated
FREELISTS NUMBER   Number of process freelists allocated to this segment
FREELIST_GROUPS NUMBER   Number of freelist groups allocated to this segment
RELATIVE_FNO NUMBER   Relative file number of the segment header
BUFFER_POOL VARCHAR2(7)   Buffer pool to be used for segment blocks:
  • DEFAULT
  • KEEP
  • RECYCLE
FLASH_CACHE VARCHAR2(7)   Database Smart Flash Cache hint to be used for segment blocks:
  • DEFAULT
  • KEEP
  • NONE
Solaris and Oracle Linux functionality only.
CELL_FLASH_CACHE VARCHAR2(7)   Cell flash cache hint to be used for segment blocks:
  • DEFAULT
  • KEEP
  • NONE
See Also: Oracle Exadata Storage Server Software documentation for more information
INMEMORY VARCHAR2(8)   Indicates whether the In-Memory Column Store (IM column store) is enabled (ENABLED) or disabled (DISABLED) for this segment
INMEMORY_PRIORITY1 VARCHAR2(8)   Indicates the priority for In-Memory Column Store (IM column store) population:
  • LOW
  • MEDIUM
  • HIGH
  • CRITICAL
  • NONE
  • NULL
INMEMORY_DISTRIBUTE1 VARCHAR2(15)   Indicates how the IM column store is distributed in an Oracle Real Application Clusters (Oracle RAC) environment:
  • AUTO
  • BY ROWID RANGE
  • BY PARTITION
  • BY SUBPARTITION
INMEMORY_DUPLICATE1 VARCHAR2(13)   Indicates the duplicate setting for the IM column store in an Oracle RAC environment:
  • NO DUPLICATE
  • DUPLICATE
  • DUPLICATE ALL
INMEMORY_COMPRESSION1 VARCHAR2(17)   Indicates the compression level for the IM column store:
  • NO MEMCOMPRESS
  • FOR DML
  • FOR QUERY [ LOW | HIGH ]
  • FOR CAPACITY [ LOW | HIGH ]
  • NULL

例如:
SELECT DISTINCT segment_type FROM dba_segments;
1.表段(TABLE)
表段是用来存储表中的数据的,这是最多见的1种段。
在创建表时将自动创建1个同名的段,表中的数据就存储在数据段中。
2.索引段(INDEX)
索引是依赖于表的数据库对象,它的功能是加快表的查询速度。
当用户履行CREATEINDEX命令创建索引时,在数据库中将产生1个索引段。
当用户在表上定义主键束缚和唯1性束缚时也将自动产生索引段。
索引段的名称与索引相同,索引中的数据就存储在索引段中。

3.临时段
当用户履行排序等操作时,将产生大量的临时数据。
临时数据将首先存储在PGA的排序区中,如果排序区的大小不足以寄存这些临时数据时,将使用临时段。
1般情况下,用户在履行以下操作时可能用到临时段:

SELECT ••• FROM ••• ORDER BY •••
SELECT ••• FROM ••• GROUP BY •••
SELECT DISTINCT ••• FROM •••
SELECT ••• UNION
CREATE INDEX •••
ANALYZE

临时段1般位于专门的临时表空间中。
如果没有专门的临时表空间,数据库服务器将把SYSTEM表空间作为用户的临时表空间。
临时段不是1种永久性的段,而是随着用户的排序操作的进行而动态产生和消失的。
当排序操作开始时,在临时表空间中将产生1个临时段,在排序结束时临时段将被删除。
如果在SYSTEM表空间中存储这些临时数据,将致使大量的存储碎片的产生,从而大大下降数据库服务器的性能。
因此, Oracle建议创建专门的临时表空间。

4.回滚段(ROLLBACK)
回滚段是用来存储回滚数据的。
如果使用自动方式管理回滚数据,需要在数据库中创建1个UNDO表空间,随着用户事务的履行,在UNDO表空间中将自动产生回滚段。
5.分区表段(TABLE PARTITION)
数据库中可以将1个大表分成几个分区( PARTITION ),每一个分区对应1个段。
这些分区表段可以存储在同1个表空间中,也能够存储在不同的表空间中
分区表主要利用于数据仓库,它的主要作用是缩小数据库查询的范围,加快查询的速度
例如,某公司的客户表中存储了上万条客户信息,假定将这个表分成13个区,将客户信息依照其姓名的首字母不同而分别存储在不同的分区中。
姓名以“A”和“B ”开始的客户存储在第1个分区中,以“C”和“D”开始的存储在第2个区中,依此类推。
这样1个表中的数据就被分开存储在13 个分区中,如果要查询1个客户的信息,只需要在它所在的分区中查询便可,查询的范围将大约缩小为原来的1/13 。

6.分区索引段(INDEX PARTITION)
与表的分区类似,索引也能够分区。
将1个索引划分为几个分区,每一个分区对应1个段,索引的数据将分别存储在这些段中
对索引进行分区的目的是为了加快查询索引的速度。

需要注意的是,只有对表进行分区后,才能在表上创建分区索引。
7.LOB段
如果在表中定义了CLOB 或BLOB 类型的列,在表中就能够存储大文本或2进制数据,如文档、图象、声音等。
LOB数据其实不是直接存储在表段中,而是单独寄存在1个LOB 段中,在表中仅仅寄存LOB 段的指针。

8.LOB索引段
如果在表上定义了LOB 类型的列,在数据库中将自动创建LOB 段,同时自动创建LOB索引段。
LOB索引段的作用是加快LOB 列的查询速度。

9.簇段(CLUSTER)
簇是1种数据库对象,它的作用是将逻辑上相干的数据组织在1起,簇中的数据来自1个或多个表。
每一个簇对应1个簇段,在创建簇时将自动创建簇段,并且簇段的名称与簇完全相同。
使用簇可以加快多表查询的速度

10.索引组织表(INDEX ORGANIZED TABLE)段
如果常常要根据1个表的主键查询数据,可以将主键列上的索引与表放在1个段中,这类表称为索引组织表,它被存储在1个表段中,这类表段就是索引组织表段。
索引组织表段的主要作用是加快基于主键的查询速度。
假定在数据库中创建1个表,在表上创建1个索引,在表中包括1个LOB列,那末创建表的结果是产生了4个段:表段、索引段、LOB段和LOB索引段。
图表示这4个段之间的关系。


段空间的管理
1般来讲,段不需要用户专门创建,当用户创建1个数据库对象时,在数据库中将自动产生对应的段。
临时段和回滚段比较特殊,临时段位于临时表空间中,它是随着用户的排序等操作的进行而动态创建和消失的。
回滚段位于UNDO表空间中,并且随着用户事务的履行而动态产生和消失。
在本地管理表空间中,区的分配策略有自动方式和手工方式两种。

如果采取自动方式(AUTOALLOCATE ),数据库服务器将决定区的大小,并自动进行区的分配和回收,区的大小是可变的,默许的区大小为64KB 。
如果采取手工方式,则需要通过UNIFORM 指定区的大小,默许为1MB 。
在创建本地管理表空间时,还可使用SEGMENT SPACE MANAGEMENT子句指定段空间的管理方式。
如果采取手工方式,则表空间将为每一个段保护1个空闲列表( Free List ),它位于数据文件的头部,在空闲列表中记录当前数据文件中所有的空闲块,段利用空闲列表管理块的分配和回收。
如果选择自动方式,段将采取位图的方式管理块的分配和回收。

为了对段中数据块的使用进行控制,在段中设置了1个HWM (High Water Mark )。
HWM可以认为是1个指针,在段刚被创建时, HWM位于段的开始位置

在HWM之上是没有被格式化,尚不能写入数据的数据块,而在HWM之下的数据块有以下几种情况:
·已包括数据
·之前曾包括数据,但后来数据被删除。
·已被格式化,且状态为空闲的。
·还没有被格式化。

为了给用户数据分配数据块,在段中还设置了1个低HWM ,位于低HWM之下的数据块要末是已包括数据的,要末是曾包括数据,但后来数据被删除的
对1个用户事务而言,可用的数据块就是那些位于低HWM 和HWM之间的数据块。
当用户向段中写入数据时,服务器进程将在低HWM 和HWM之间查找那些已被格式化的数据块,将数据写入这些数据块。
如果没有足够的数据块可用,服务器进程将在这个范围内查找那些还没有被格式化的数据块,对其进行格式化,然后将数据写入。
如果这样的数据块还不能满足要求,服务器进程将把HWM 向上移动,为这次事务分配其他还没有格式化的数据块,然后对其进行格式化,并将数据写入。

在将数据写入数据块以后,服务器进程将把低HWM 向上移动,使其指向第1个可用的数据块。
数据块的分配情况如图所示。



区的管理
区是Oracle数据库对象分配存储空间的基本单位。
当用户创建表、索引、簇等数据库对象时,数据库服务器将为该对象对应的段分配若干个区,以存储该对象的数据。
当段的空间被消耗完时,可以进行扩大,数据库服务器将为该段分配新的区。
当1个数据库对象被删除时,它所占用的区将被释放,数据库服务器负责回收这些区,并在适当的时机将这些空闲辨别配给其他数据库对象。

区的分配
在本地管理表空间中,区的大小要末由数据库服务器自动指定,要末由数据库管理员指定。
当在表空间中创建表、索引等数据库对象时,数据库服务器将依照指定的大小为段分配相应数量的区,在默许情况只分配1个初始区,虽然在这个区中还没有包括数据,但这个区不能分配给其他数据库对象。
当初始区被写满后,数据库服务器将根据需要为段分配其他的区。
在表空间的每一个数据文件的头部,都有1个位图,用来控制块的分配

当为段分配1个区时,数据库服务器将在位图中查找可用的数据块,将它们分配这个区。
首先我们履行下面的语句来创建本地管理表空间ts4:

CREATE TABLESPACE TS4 DATAFILE 'C:\Users\john\Desktop\tbs\ts4_1.dbf' SIZE 1M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

由于采取了自动分配方式( AUTOALLOCATE ),因此在表空间ts4 中所有区的大小默许都是64KB 。
接下来我们在表空间ts4 中创建表tab3:

CREATE TABLE tab3 (col INT) TABLESPACE ts4;
这样将为段TAB3分配1个区,大小为64KB ,占用8个数据块(每一个数据块大小为8KB )。
履行下面的查询语句,将得到为段TAB3 分配得区的信息:

SELECT bytes, blocks, extents FROM dba_segments WHERE segment_name='TAB3';
1个段所占用的区的详细信息可以通过查询数据字典DBA_EXTENTS取得。
下面是有关数据字典DBA_EXTENTS的信息。
DBA_EXTENTS describes the extents comprising(构成) the segments in all tablespaces in the database.
Note that if a data file (or entire tablespace) is offline in a locally managed tablespace, you will not see any extent information. If an object has extents in an online file of the tablespace, you will see extent information about the offline data file. However, if the object is entirely in the offline file, a query of this view will not return any records.
Related View
USER_EXTENTS describes the extents comprising the segments owned by the current user's objects. This view does not display the OWNER,FILE_ID, BLOCK_ID, or RELATIVE_FNO columns.
Column Datatype NULL Description
OWNER VARCHAR2(128)   Owner of the segment associated with the extent
SEGMENT_NAME VARCHAR2(128)   Name of the segment associated with the extent
PARTITION_NAME VARCHAR2(128)   Object Partition Name (Set to NULL for nonpartitioned objects)
SEGMENT_TYPE VARCHAR2(18)   Type of the segment: INDEX PARTITION, TABLE PARTITION
TABLESPACE_NAME VARCHAR2(30)   Name of the tablespace containing the extent
EXTENT_ID NUMBER   Extent number in the segment
FILE_ID NUMBER   File identifier number of the file containing the extent
BLOCK_ID NUMBER   Starting block number of the extent
BYTES NUMBER   Size of the extent in bytes
BLOCKS NUMBER   Size of the extent in Oracle blocks
RELATIVE_FNO NUMBER   Relative file number of the first extent block

例如,下面的SELECT语句用于查询段TAB3所占用的区的ID 、大小、区中所包括数据块的数目和第1个数据块的ID:
SELECT extent_id, bytes/1024 ||'K' KBytes, blocks, block_id FROM dba_extents WHERE segment_name='TAB3';
区的回收
在1般情况下,从段中删除数据时,数据所占用的空间并没有被释放,除非这个数据库对象被删除。
在以下几种情况中,会产生区的回收:
·1个对象被删除。
.对表进行整理。
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐