1. 数据库存储结构
逻辑结构—————物理结构
- 物理结构
不同类型的数据文件,数据文件是真实存在的 - 逻辑结构
数据库为数据库中的所有数据,分配逻辑数据库空间。数据库空间分配的单位是数据块、区段和段。
顺序:表空间-段-区-块
很多块组成区,很多区组成段,很多段组成表空间
- database 数据库:Oracle数据库至少由两个称为表空间的逻辑存储单元组成,它们共同存储数据库的所有数据。必须拥有SYSTEM和SYSAUX表空间
- tablespace 表空间:一个表空间由一个或多个名为datafiles的数据文件组成,这些文件是Oracle数据库运行的操作系统上的物理结构文件。
数据文件表 dba_data_files
数据是存储在组成数据库的每个表空间的数据文件中
- segment 段:一个表空间对应多个段。段是数据库中的对象如表、索引等,一个段就是一张表或一个索引,段和表/索引是一对一的关系,表是数据段,索引是索引段。
- extent 区
- block 块:一个块8k
2. 表空间
表空间是一个逻辑概念,物理上对应一个或多个数据文件 datafile 或临时文件tempfiles,逻辑上表空间是存储段的容器。
表空间逻辑的把两个物理文件看作是一个整体,将一个或多个数据文件整合在一起。
2.1 表空间类型
-
permanent 永久表空间(如上SYSTEM、SYSAUX和USERS表空间)
-
temporary 临时表空间
-
UNDO 回滚表空间
2.2 管理方式
在建立表空间时确定的,分为两种:
- 段管理方式有 AUTO(自动) 和 MANUAL(手动) 两种
区管理方式有本地管理(可理解为自动管理)和字典管理(已淘汰)两种。
3. 段、区、块的关系
-
数据存储在Block数据块中,一个数据块8K,对应在物理磁盘上,段是一组Extents,由一个数据块或者多个数据块组成
-
区是由一个或多个连续的数据块组成,区段是分配给存储特定类型信息的特定数量的连续数据块。区不能跨段,一个区只属 于一个段。
-
段由一组区Extents构成,其中包含表空间中特定逻辑存储结构的所有数据,所有Extents都存储在相同的tablespace表空间中。一个表或者一个索引就是一个段。
3.1 段 segment
- 段是逻辑概念,对应数据库中的对象。
- 段的类型
表段、索引段、undo 段、临时段 - 创建一个表,ORACLE 为表创建一个(或多个)段,在一个段中保存该表的所有表数据(一个数据表就是一个段或多个段,但不能跨段)。
表分为堆表和分区表(比如将emp表中的hiredate按年份分区,此时一个分区就是一个段)
分区表在数据量庞大的时候使用,分区键值有其自己的索引,在查询时先扫落在哪个分区,然后只在分区中搜索。 分区表可以对某一个分区进行truncate
例子:
a.建表
b. 查询
c.查看用户的段
d.查看全部的段
延迟段创建:当表里没有数据时,oracle数据库不为这个表创建段,所以如果表中没有数据,表的物理空间分配将延迟到这张表有实际数据插入的时候。
- 通常段中至少有一个初始区。当这个段数据增加使得区(extent)不够时,将为这个段分配新的后续区。(11g 段空间延时分配)
- 表空间在逻辑上可以存在多个段,物理上可以对应多个数据文件,一个段比较大时可以跨多个数据文件。(表可以跨数据文件)
比如:创建一个表,ORACLE 为表创建一个(或多个)段,在一个段中保存该表的所有表 数据(表数据不不能跨段)。
6. 管理方式
free space空闲空间可以自动管理,也可以手动管理
空闲空间在数据库段内是自动管理的。段内空闲/使用的空间使用位图跟踪,而不是使用空闲列表。自动分段空间管理提供了以下好处:
- 易用性
- 更好的空间利用率,特别是对于行大小差异很大的对象
- 更好地对并发访问中的变化进行运行时调整(并发:一个表能被多个用户使用)
- 在性能/空间利用率方面,能更好的多实例行为(在创建本地管理的表空间时,指定自动分段空间管理。然后,该规范应用于随后在这个表空间中创建的所有段)
3.2 区 extent
- 概 念
Extent是进行存储空间分配的基本单位。
一个区是由一系列逻辑上连续的数据块组成的逻辑存储结构。
段中第一个区叫初始区,随后分配的区叫后续区。
- Extent 管理理⽅方式
- 字典管理
在数据字典中管理理表空间的区空间分配。Oracle 8i 以前只有通过uet$和fet$的字典管理。
缺点:某些在字典管理方式下的存储分配有时会产生递归操作,并且容易产生碎片,从而影响了系统的性能,现在已经淘汰了。 - 本地管理
在每个数据文件中使用位图管理空间的分配。表空间中所有区(extent) 的分配信息都保存在该表空间对应的数据文件的头部。
每个区的大小:autoallocate 自动调整 /uniformsize 固定大小
优点:速度快,存储空间的分配和回收只是简单地改变数据文件中的位图,而不像字典管理方式还需要修改数据库。无碎片,更易于维护
- 数据表和Extent的关系
当建立表的时候建立段,然后自动分配相应的extent(1个或者多个),亦可以手工提前分配extent(用于需大量插入数据的表)
例子:查看段的初始区分配情况 SQL
SQL> col SEGMENT_NAME for a15
SQL> col SEGMENT_TYPE for a10
SQL> select SEGMENT_NAME,SEGMENT_TYPE,EXTENT_ID,BLOCKS,BYTES/1024 K from user_extents;
SEGMENT_NAME SEGMENT_TY EXTENT_ID BLOCKS K
--------------- ---------- ---------- ---------- ----------
DEPT TABLE 0 8 64
EMP TABLE 0 8 64
SALGRADE TABLE 0 8 64
EMP_NAME TABLE 0 8 64
PK_DEPT INDEX 0 8 64
PK_EMP INDEX 0 8 64
PK_STD_ID INDEX 0 8 64