oracle的"行省制度"

元朝做了一件具有创造性的事情,就是首创了行省制度,这个行省制度我们仍然在使用-------国家,省,市,区县,镇,这样的一个地域制度显然的一个好处就是便于管理。



oracle的内部空间结构非常复杂,就像一个拥有庞大面积的国家一样。因此,它也采取了自元朝以来沿袭下来的“行省制度”------数据库database,表空间tablespace,段segment,区extent,块block,数据库由一个或多个表空间组成,表空间包含段,段包含区,区包含块。这些所谓的表空间,段空间,区空间,块空间实际是不存在的,就像我们为了方便治理北纬30度08分到北纬24度38分,东经108度47分至东经114度15分之间的这块21.18万平方公里的土地,于是我们便将其命名为"湖南省",后面又命名了各个市,区,乡镇。



01.段segment


段是表空间中主要的组织结构,就是占用存储空间的数据库对象,如表,索引及回滚段。例如你在创建表时,会创建一个表段;你在创建索引时,就会创建一个索引段;你在创建函数时,就会创建一个函数段,依次类推,占用存储空间的每一个对象最后都会存储在一个段中。我们可以通过视图dba_segments查看段空间的主要信息:

oracle的"行省制度"_表空间




02 区extent

段本身又由一个或多个区段组成。传统的每个段都至少有一个区段,自11gR2起oracle引入了“延迟”段的概念------当你创建对象时,oracle不会立即为段分配一个新的区段,只有当数据真正写入到这个对象(比如说insert语句),oracle才会为这个段分配第一个 段。第二个区段不一定在磁盘位置上紧挨着第一个区段,甚至有可能不在第一个区段所在的文件中,这就像某个市的A区和B区是相邻,但是物理结构上B区并不在A区那522平方公里里面。区段的大小可能不同,可以是一个oracle数据块,也可以大到2GB. 视图dba_extents可以方便我们了解区:

oracle的"行省制度"_block_02





03 块block

块是Oracle中最小的空间分配单位,可以理解为乡镇。行数据,索引条目或临时排序结果就存储在块中。通常Oralce从磁盘读写的就是块。数据块的大小是通过KB字节个数来指定的,默认为8KB。Oracle中块的常见大小有4种:2KB,4KB,8KB,16KB。可以查看下block大小:8192KB=1024KB*8


无论块大小如何,基本所有块都遵守下图内部结构:表目录+行目录+空闲空间+数据空间。

oracle的"行省制度"_block_03



04 表空间tablespace

表空间是一个容器,其中包含有段。每个段都只属于一个表空间,正如每个市都属于固定的省份一样。一个表空间中可能有多个段。一个段的所有区段都在段所属的表空间中。段绝对不会跨越表空间边界。表空间(逻辑结构)本身可以有一个或多个数据文件(dbf,数据结构)。一个区段仅会存放于一个数据文件中。不过,段可以有来自多个不同数据文件的区段。所以在实际工作中我们经常要去查看表空间使用率:

select a.tablespace_name,
       round(a.maxbytes /1024/1024/1024) "Sum GB",
       round((a.bytes - b.free_bytes) /1024/1024/1024) "used GB",
       (a.bytes - b.free_bytes) "used ",
       round((a.maxbytes-(a.bytes - b.free_bytes)) /1024/1024/1024) "free_all GB",
       round(((a.bytes - b.free_bytes) / a.maxbytes) * 100, 2) "percent_used"
  from (select tablespace_name, sum(decode(maxbytes,0,decode(autoextensible,'YES',34359721984,bytes),maxbytes)) maxbytes,sum(bytes) bytes
          from dba_data_files
         group by tablespace_name) a,
       (select tablespace_name, sum(bytes) free_bytes
          from dba_free_space
         group by tablespace_name) b
 where a.tablespace_name = b.tablespace_name
 and a.tablespace_name in ('USERS')
 order by ((a.bytes - b.free_bytes) / a.maxbytes) desc;


表空间不够的时候,我们可以通过给指定表空间增加数据文件:

ALTER TABLESPACE app_data ADD DATAFILE

'/home/ORACLE/PRODUCT/10.2.0/ORADATA/EDWTEST/APP04.DBF' SIZE 50M AUTOEXTEND ON NEXT 5M MAXSIZE 100M;



总结下Oracle"行省制"的逻辑结构和物理结构(DBF)的关系:

1>数据库由一个或多个表空间组成;

2>表空间由一个或多个数据文件组成。表空间包含段。

3>段(Table,index等)由一个或多个区段组成。段不能跨表空间存放,但是,段中的数据可以跨文件(当然,隶属于同一表空间)存放。

4>区段是磁盘上一组逻辑连续的块。区段只能在一个表空间中,而且总是在该表空间内的一个文件中。

5>块是数据库最小的分配单位,也是数据库使用的最小的I/O单位。



一技之长,投资理财,阅读写作,欢迎关注公众号"石林笔记"或者扫一扫哦:

oracle的"行省制度"_segment_04