oracle逻辑存储结构

  • 一、定义
  • 二、数据块
  • 二、区(extent)
    • 2.1 区的分配
    • 2.2 区的释放
  • 三 段
    • 3.1段的分类
    • 3.2 段相关的视图
  • 四、表空间
    • 4.1 表空间分类
    • 4.1.1 大文件表空间
    • 4.1.2 系統表空間
    • 4.1.3 辅助表空间
    • 4.1.4 回滚表空间
    • 4.1.5 临时表空间

一、定义

oracle的逻辑结构包括表空间(tablespace),段(segment),扩展区(extent),数据块(data block)
oracle数据库在逻辑上是由多个表间组成的,表空间中存储的对象叫段,比如数据段,索引段,和回退段。段由区组成,区是磁盘分配的最小单位。段的增大是通过增加区的个数来实现的。每个区的大小是数据块大小的整数倍,区的大小可以不相同;数据块是数据库中最小的I/O单位,同时也是内存数据缓冲区的单位,及数据文件存储空间单位。块的大小由参数DB_BLOCK_SIZE设置,其值应设置为操作系统块大小的整数倍。
结构图如下
oracle逻辑存储结构_第1张图片

二、数据块

数据块是数据中最小的数据组织单位与管理单位, 数据库中最小的逻辑存储单元,是数据文件磁盘存储空间单位,也是数据库I/O 的最小单位(读一个数据块,产生一次IO),数据块大小由DB_BLOCK_SIZE参数决定。
oracle 每次请求数据的时候,都是以块为单位。也就是说,oracle每次请求的数据是块的整数吧。
数据块结构如下图所示
oracle逻辑存储结构_第2张图片
块头:存放块的基本信息,如块的物理地址、块所属的段类型(是数据段还是索引段)
表目录:存放表的信息,即:如果一些表的数据被存放在这个块中,那么,这些表的相关信息将被存放在表目录中。
行数据:真正存放表数据和索引数据的地方。这部分空间也被数据行占用空间。
空余空间:空余空间是一个块中未使用的区域,这片区域用于新行的插入和已经存在的行更新。
头部信息区:我们把块头、表目录、行目录这三部分合称为头部信息区,头部信息区不存放数据,它存放的是整个块的信息。头部信息区的大小是可变的。一般来说 头部信息区 大小介于84字节和107字节。
当往数据库中插入数据的时候,块中的自由空间会减少;当对块中已经存在的行进行修改(update)的时候(使记录长度增加),块中的自由空间也会减少。
当使用delete或者update使行记录变小的时候,oracle会释放部分自由空间,释放的自由空间并不是连续的。
通常情况下oracle不会对块中不连续的自由空间进行合并。只有当用户进行数据插入或者更新操作,却找不到连续的自由空间的时候,oracle才会合并数据块中的不连续自由空间。
对于块中的自由空间,oracle提供两种管理方式:自动管理和手动管理。
1.1获取数据块编号

SELECT dbms_rowid.rowid_block_number(ROWID) BLOCK, --返回输入ROWID的数据块号 
       COUNT(1)
  FROM emp t
 GROUP BY dbms_rowid.rowid_block_number(ROWID);

oracle逻辑存储结构_第3张图片

看到表emp 数据全部分布在一个数据块上

二、区(extent)

区是磁盘空间分配的最小单位。磁盘按区划分,每次至少分配一个区。区存储于段中,它由连续的数据块组成。区的分配过程中,每次至分配5个区。如果所剩的空闲空间不够5个区,就会出现错误:ORA-01653。可以通过字典dba_tablespaces查询表空间中区的信息。可以通过字典user_tables查询段中区的信息。可以通过字典user_extents查询区的分配状况。我们可以通过以下SQL语句分别查询表空间、段、区中区的分配信息
一个或多个块组成区,一个或多个区组成段。
一个区只能属于一个数据文件。

 SELECT t.segment_name    区名称,
       t.segment_type    区类型,
       t.tablespace_name 表空间,
       t.extent_id       区id,
       t.bytes           区大小,
       t.blocks          块数目
  FROM user_extents t;

oracle逻辑存储结构_第4张图片

2.1 区的分配

当创建一个表时,oracle会给这个表的数据段分配一个初始区(initial extent),即使没有数据的插入,oracle还是会分配这个初始区。伴随着数据的插入,这个初始区的空间被填满数据,oracle会再分配一个新的区给这个数据段,这样的区,我们把它叫做递增区,如果第一个递增区用完,oracle还会分配另外的递增区,周而复始地这样循环下去。
出于管理的需要,段的头部含有区的一个目录。

2.2 区的释放

通常分配给一个段的区所占用的空间不会释放。除非我们把和这些段相关的对象给删除(drop table或drop cluster) 但是我们可以通过下面的方式回收分配给一个段的区。

truncate …… drop storage 命令会回收分配给一个段的区。

alter table …… deallocate unused 命令会回收已经分配给一个段,但还没使用的区。

三 段

段是由一个或多个连续或不连续的区组成的逻辑存储单元,用于存储特定的、具有独立存储结构的数据库对象。根据存储对象类型不同,分为: 数据段(表段)、索引段、临时段和回退段4类。
表由段组成,一个表由一个或者多个段组成。普通表由一个段组成,分区表由多个段组成。
创建表的时候,其实质就是创建一个或者多个段。
oracle逻辑存储结构_第5张图片

3.1段的分类

表段:又称数据段,用来存储表或簇的数据,可以细分为普通表段、分区表段、簇段、索引化表段
创建数据段的时候,可以指定数据段的存储参数。
索引段:用来存放索引数据,包括 ROWID 和索引值,每个非分区索引有一个单独的索引段。
创建索引时,实质就是创建一个或者多个索引段
回退段:用于保存数据库的回退信息,包含当前未提交事务所修改的数据的原始版本。利用回退段中保存的回退信息,可以实现事务回滚、数据库恢复、数据的读一致性和闪回查询

数据段用来存储用户的数据,每个表都有一个对应的回滚段,其名称和数据表的名字相同。
索引段用来存储系统、用户的索引信息。
回滚段用来存储用户数据修改前的值

3.2 段相关的视图

通过视图 dba_segment或者 user_segments;可以知道 段名称与数据库对象名称一致 ;

select t.owner 用户,t.segment_name 段名称 ,t.tablespace_name 表空间名称 ,T.segment_type 段类型  from  dba_segments t
  where t.owner='SCOTT';--查看scott 用户下的段

–查询结果中除了有表外还有索引
查看段、区、块的关系

SELECT t.segment_name    段名称,
       t.segment_type    段类型,
       t.tablespace_name 表空间名称,
       t.bytes           字节数,
       t.blocks          块数目,
       t.extents         区数目
  FROM user_segments t;

oracle逻辑存储结构_第6张图片

四、表空间

是Oracle数据库最大的逻辑结构,一个Oracle数据库在逻辑上由多个表空间组成,一个表空间只隶属于一个数据库。Oracle中有一个称为SYSTEM的表空间,这个表空间是在创建或安装数据库时自动创建的。主要用于存储系统的数据字典,过程,函数,触发器等;也可以存储用户的表,索引等。这些对象实际上是存放在数据文件中,数据文件是数据的物理载体。一个表空间可以有多数据文件,但是一个数据文件只能属于一个表空间。一个表空间就是一片磁盘区域,他由一个或者多个磁盘文件组成,一个表空间可以容纳许多表、索引或者簇等。每个表空间有一个预制的磁盘区域称为初始区间(initial extent)用完这个区间后再用下一个,直到用完表空间,这时候需要对表空间进行扩展,增加数据文件或者扩大已经存在的数据文件;每个数据库都拥有一个系统表空间(SYSTEM tablespace)和一个辅助表空间(SYSAUX tablespace)

4.1 表空间分类

表空间根据存储数据类型的不同,分为系统表空间非系统表空间两类。
系统表空间主要存放数据库的系统信息,如数据字典、数据库对象定义信息,数据库组件信息等。
非系统表空间又分为撤销表空间、临时表空间和用户表空间等。其中撤销表空间用于自动管理数据库的回退信息,临时表空间用于管理数据库的临时信息,用户表空间用于存储业务数据。

4.1.1 大文件表空间

大文件表空间是由一个很大的数据文件组成。大表空间使用oralce能够使用和管理超级大的文件 。
默认情况下,系统默认创建的是小文件表空间,小文件表空间是传统的表空间类型,oracle创建的system表空间和sysaux表空间都是小文件表空间

使用大文件表空间的优点:
1、使表空间的容量更大
2、在超大型数据库中,简化数据文件的管理,使用大文件表空间,可以减少SGA的需求,同时还可以控制文件尺寸。
3、简化整个数据库的管理

4.1.2 系統表空間

每个数据库都有一个叫system的表空间,一旦打开数据库,系统表空间必须在线(online)数据字典的数据被存放在系统表空间中。

4.1.3 辅助表空间

辅助表空间是对系统表空间的补充,许多数据库组件(components)的信息不存放在系统表空间中,而是存储放在辅助表空间中,创建数据库的过程中,oracle会自动创建辅助表空间,通常情况下,oracle不允许删除和重命名辅助表空间。Oracle也不支持传输辅助表空间

4.1.4 回滚表空间

undo tablespace 回滚表空间是一种类型的表空间,用于存放回滚数据。回滚段表空间是一个特殊的表空间,回滚段表空间只能用于存放回滚段。不能在回滚段表空间创建其他数据库对象(如表、索引)。每个数据库可有零个或者多个回滚表空间。但是只能有一个活动的回滚表空间。system回滚段是特殊的回滚段,它存在于system表空间,system回滚段用于回滚系统事务。非系统事务只能交由非系统回滚段来处理。因此,除了系统回滚段表空间外,每个数据库应该另外创建一个回滚段表空间

4.1.5 临时表空间

临时表空间是临时存放数据的地方。临时表空间中含有排序段,临时数据都放在排序段中,临时数据是进行排序时用到的一些数据,这些数据暂时存放在临时段中,一个sql语句可能会使用一个或者多个临时表空间。临时表空间中不能创建永久性的数据对象(如表、索引)一个排序段可以被多个排序操作所共享。当执行第一次排序的时候,oracle在临时表空间中创建排序段,这个排序段不断扩展,直到能够容纳所有的排序数据。创建用户的时候,应该给用户指定一个临时表空间,用户的排序段存放在这个表空间中,如果没有给用户指定临时表空间,oracle会自动给这个用户指定一个临时表空间,这个临时表空间叫默认临时表空间。如果系统表空间是本地管理的,则必须定义一个默认临时表空间system表空间不能作为默认临时表空间;如果系统表空间是字典管理的,则不必定义一个默认临时表空间,sytem表空间可以作为默认临时表空间,但是一旦用户使用系统表空间进行排序,oracle会发出警告。从性能的角度考虑,不应该把sytem表空间作为临时表空间。创建数据库的时候。可以指定默认临时表空间,数据库完成以后,我们也可以使用alter database default
temporary tablespace 名令指定默认临时表空间。

查看临时表空间

     SELECT tablespace_name,
             file_name,
             bytes / 1024 / 1024 file_size,
             autoextensible
        FROM dba_temp_files;
--默认临时表空间
select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';

你可能感兴趣的:(oracle存储结构,oracle逻辑存储结构,oracle,数据块,段,区,表空间详解)