Home  >  Article  >  Database  >  Oracle数据库的逻辑存储结构

Oracle数据库的逻辑存储结构

WBOY
WBOYOriginal
2016-06-07 17:02:331462browse

oracle通过数据块管理数据文件中的存储空间。数据块是数据存储的最小单位。在操作系统中,数据都是以位的方式进行存储。 每个操作

本章主要介绍Oracle数据库的逻辑存储结构及其关系,包括以下内容 
一、介绍data block,extent,segment 
二、Data Block综述 
三、Extent综述 
四、Segment综述 

一、介绍 
数据块(Block):数据块是oracle的存储单位,也叫逻辑块,oracle块,是物理磁盘的一个空间。 
区(Extent):一组数据块构成一个区。 
段(Segment):由一组区构成,被分配到一个特定的数据结构中,段只能存储于一个表空间中,不能跨越表空间存储 
当构成一个段的所有区空间满了后,系统需要分配其他的区给该段以便存储数据,这些新增的区可能是临近的也可能不是临近的。 
段以及构成段的所有区只能存在于一个表空间中,但是段是可以跨越数据文件的,而区是不能跨越数据文件的。 
如果分配一个区到一个特定的场合,那么区所包含的数据块同时也被分配过去。 
如果区没有被分配到一个特定的场合,那么他所对应的数据块只有在高水位线改变的时候才会被分配。 
高水位线是段中使用和为使用空间的一个分界线。 
二、数据块综述 
oracle通过数据块管理数据文件中的存储空间。数据块是数据存储的最小单位。在操作系统中,数据都是以位的方式进行存储。 
每个操作系统都有个block size,而oracle中的data block size是操作系统数据块大小的倍数。在oracle中,数据块的大小由 
初始化参数db_block_size决定。 

数据块包含了header(包含基本信息,比如块地址,段类型),table directory(),rowdirectory,free space,row data 
其中header,table directory,row directory统称为overhead,overhead大小有些固定有些可变,平均下来overhead大小 
在84--107bytes之间。 
row data 包含 table data或者index data。row可以跨越block 
free space分配给那些需要增加额外空间以便insert或者update 数据。 
Free Space Management 
可以手动或者自动管理。bitmap方式对空间进行管理。当创建本地化管理表空间后,段空间即为自动管理,同时在该表空间 
创建的其他段也同样为自动管理。 
当free space不连续时,向该段insert数据,oracle会对这些不连续的block进行压缩、接合处理,,这将降低数据库的性能, 
因此仅到出现block不连续时,数据库才会做如此操作。 
Row Chaining and Migrating 
当一条记录特别大,一个block不足以存储时,oracle会把这条记录存储在多个block中,并且把这些block连接起来,当成一个block 
处理,这种情况在long和long raw型中经常出现。 
当一条记录存储在一个block中,现被update,该blcok的空闲空间被占满,那么oracle将把这条记录从以前的block中移动到一个 
新的block中存储,row id将不会改变。 
当以上两种情况发生时,I/O性能会降低,因为oracle查询这条记录时将扫描不止一个block 
PCTFREE PCTUSED 
The PCTFREE parameter sets the minimum percentage of a data block to be 
reserved as free space for possible updates to rows that already exist in that block. 
PCTFREE定义一个数据块的最小空闲百分比。如在create table是设置了PCTFREE 20,那么这个segment中的每个数据块空间最多被insert占用到80%,剩下的20%,用来给update已经存在于该块中的数据用。 
The PCTUSED parameter sets the minimum percentage of a block that can be used 
for row data plus overhead before new rows are added to the block. 
PCTUSED定义一个数据块能被insert 时的该块最小的空间占用百分比。如在create table时设置了PCTUSED 40,那么只有当占用百分比小于40%时,该块才能再次被insert数据。 
此时感觉PCTFREE和PCTUSED有些矛盾,且看下面的定义。 
PCTFREE、PCTUSED一起作用 
在一个新分配的块中能用于insert 的空间为块大小减去 块头(overhead)及PCTFREE空间的总和后剩下的空间。update可以使一个数据块的可用空间小于PCTFREE。 
每个data segment或者index segment都有多个free list,只有那些空闲空间大于PCTFREE且使用空间小于PCTUSED的块才会存在于FREE list中,可被选用。当发起insert时,ORACLE会检查free list中第一个可用块,当该块的空闲空间不足以满足该insert,该块将被ORACLE从该free list中丢弃。当insert并发时,一个段有多样的freelist 可以减少对freelist的竞争。 
当一个新的块被用来insert时,最多能被使用到80%的空间,剩下20%用来update已经存在于该块中的数据,当占用率到了80%以后,如果该块的使用率一直在40%以上,那么将不能在insert into 数据到该块中。只要当该块的使用率变化到40%以下时,该块才会出现在free list中,且该块才可能被再次insert into数据,且最多insert 到80%。 
当delete或者update 发生后,oracle会检查该块的可用空间,如果可用空间小于PCTUSED时,该块将被放到freelist中的起始位置供该事务使用,当commit后,可以被其他的transaction使用。 
三、extent 综述 
extent是数据库分配存储空间的一个逻辑单位,extent组成segment,构成段的extent的空间被使用完后,数据块立即分配新的区给segment使用。 
When Extents Are Allocated 
当创建一个表时,Oracle会分配一个初始的且指定block数量的extent给这个segment,即便没有行数据被insert into 这个表,与初始区对应的数据块还是为这个表的行数据保留的。当初始区空间被占满,且需要更多的空间来满足需求时,oracle自动的分配incremental extent以满足需求。 
Determine The Number and Size of Extent 
Storage Parameter表达了每个段中区的定义。storage parameter适用各种类型的segment,他们控制了空闲空间是如何分配给段的,比如你可以确定一个数据表需要分配多大的空间做为了初始空间,或者你可以根据create table时指定的存储参数限制分配给段的区个数。如果没有给一个段指定存储参数,那么将适用tablespace 的一些默认存储参数。 
不管区管理方式是否明确指定,由于本地化管理的方式在性能上由于数据字典管理方式,非system的永久表空间都是本地化方式管理(local managed)。 
在建立表空间时如果指定uniform,则指定了表空间的区为统一的大小,如果指定autoallocate则表空间的区大小为系统自动管理,是可变的。 
对于uniform的方式管理区,指定区大小也可以使用默认的区大小,默认区大小为1M,临时表空间只能使用这种方式对区进行管理。 
对于system-manage的方式管理区,ORacle确定增加区的最佳大小为最小64K,永久使用的表空间都默认是对区进行自动管理的。 
存储参数initial,next,minextents,pctincrease并不是在tablespace这一级指定,是在段这一级指定。 
How Extents Are Allocated 
根据是本地管理表空间还是数据字典管理表空间,oracle利用不同的运算法则来分配区。本地化管理表空间,Oracle为一个新的区分配空闲空间时,在表空间中的一个候选datafile中查找所需的临近的空闲空间的block数量,如果数量不能满足需求,那么将查找下一个datafile。注意,区是不能跨越数据文件的。 
When Extents Are Deallocated 
通常情况下,只有在drop对象时,所占用的空间才会被释放给相应的表空间。除非在以下情况: 
1、truncate ......drop storage 
2、alter table table_name deallocate unused; 
SQL> select sum(blocks) from dba_extents where segment_name='CLUB_BOOK_INFO_BAK1230'; 
SUM(BLOCKS) 
----------- 
        2432 
SQL> alter table club_book_info_bak1230 deallocate unused; 
Table altered. 
SQL> select sum(blocks) from dba_extents where segment_name='CLUB_BOOK_INFO_BAK1230'; 
SUM(BLOCKS) 
----------- 
        2336 
3、当给回滚段指定了最佳大小时,oracle会周期性的释放回滚段的空间。 
当区变成free时,如果是本地化管理表空间,oracle会修改位于数据文件中的位图(bitmap),如果是字典管理表空间oracle会更新数据字典。 
Extents in nonclusterd Tables 
当你对非聚簇执行delete 后,不会释放这个表所占用的extents,只有当你drop时ORacle才会回收所占用的extents给这个表空间的其他需要空间的段。 
Extents in clusterd Tables 
当对聚簇的一个表进行drop后,并不能释放分配给他的区,因为聚簇的数据并不是给一个表用的。还包括了其他表的数据。 
Extents in materialized views and their logs 
在物化视图及其日志中,对区的释放和表及聚簇方式一样。 
Extents in index 
drop index后,释放相应的区。 
Extents in temporary Segments 
Oracle 完成一个需要临时段的任务后,会自动释放这个临时段。当多重排序完成后,并不释放临时段,而是保持其对其他的排序可用。当一个事务完成后,Oracle会把临时段drop掉并且返回临时段所分配的空间给临时表空间。 
Extents in Rollback Segments 
Oracle会周期性的检查回滚段,看他们的大小是否超过了一个设定的最佳值,当超过最佳值后,Oracle自动的是否一个或多个区。 
四、Segment综述 
段是由区组成的,数据段由Oracle分配一个或者多个区组成,索引段也同样是由Oracle分配的一个或者多个区组成的。 
本节包含以上内容: 
数据段介绍 
索引段介绍 
临时段介绍 
回滚段自动管理 
Introduction to Data Segment 
在Oracle数据库中,一个单一的数据段保存着所有的数据库,数据段有以下形式: 
1、非分区表 
2、分区表的分区 
3、聚簇 
当用CREATE创建一个表或者聚簇,Oracle为他们创建数据段。存储参数决定了构成数据段的区是如何分配的。可以用CREATE或者ALTER设置这些存储参数,这些存储参数影响了数据恢复和存储的效率。 
Introduction to Index Segments 
非分区索引有一个索引段,分区索引一个分区有一个索引段。用CREATE index 创建一个索引或者一个分区索引时,ORacle会自动创建一个索引段存储参数决定了索引段的区是如何分配的。可以设置这些存储参数,他们会影响数据恢复和存储的效率。 
Introduction to Temporary Segments 
当执行查询时,Oracle需要临时空间来供SQL的分解和执行。临时段是Oracle自动分配的磁盘空间。Oracle需要一个临时段作为数据库空间供排序用。当排序可以在内存中完成或者Oracle找到其他的方法利用索引完成,Oracle是不会创建临时段的。 
需要临时段的操作: 
1、create index 
2、select....order by 
3、select distinct ... 
4、select ...group by 
5、select ....union 
6、select ....intersect 
7、select ....minus 
Oracle为临时表以及他们的临时索引分配临时段。与分配临时段给查询相比,分配临时段给临时表的方式是不一样的。 
Introduction to UNDO Segments 
ORACLE强烈推荐使用UNDO表空间来自动管理,而不是使用rollback segment来进行管理。可以查看v$undostat视图,监控和配置数据库系统所使用的undo space。 

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn