图示
段
存在于表空间
中段
是区
的集合区
是数据块
的集合数据块
会映射到磁盘块
以实体-关系图的形式绘制 Oracle 存储模型,逻辑结构在左,物理结构在右。
- 有一个关系使用虚线绘制,表示段和数据文件的多对多关系。之所以使用虚线表示关系,是因为这种关系不应该存在。出色的关系工程师不应该允许多对多关系的存在。
表空间 tablespace
- 表空间 tablespace 是 存储结构中的最高层结构。
- 建立一个表空间的时候,需要指定存储的文件。表空间是可以跨物理存储的,但是表空间的下一级对象 - 数据段是不能指定存储在那个文件里的。
- 要想让数据对象访问 IO 负载均衡,需要指定不同的数据对象在不同的表空间里。这也就是为什么将数据表和索引建立在不同的表空间的原因。
- 表空间的创建:
主要表空间 | 描述 |
---|---|
SYSTEM | 系统表空间,用于存储内部表和数据字典等 |
SYSAUX | 系统辅助表空间,由 Oracle 自行维护 |
UNDO | 存在撤销信息的表空间 |
USERS | 建议用户使用的表空间 |
--查询系统表空间信息
SELECT * FROM dba_tablespaces;
SELECT * FROM user_tablespaces;
数据段 segment
- 任何类型的数据库对象,本质上都是一种数据段。数据表、索引、回滚、聚集这些都是数据段的一种表现形式。
- 数据段是在数据对象创建时就已经创建出来的,随着对象体积的增大,而不断分配多个 extents 进行管理。
--数据段类型
SELECT DISTINCT t.segment_type FROM dba_segments t;
--查询系统段信息
SELECT * FROM dba_segments;
SELECT * FROM user_segments;
--查询区、块信息
SELECT ds.owner,
SUM(ds.bytes) / 1024 / 1024 "所占空间(单位: MB)",
SUM(ds.blocks) 数据块,
SUM(ds.extents) 分区
FROM dba_segments ds
WHERE ds.owner = 'SYS'
GROUP BY ds.owner;
区 extent
- 物理存储通常是
随机
的读写过程。即使在同一个文件里,我们也不能保证相同的一个信息是是存储在绝对连续的物理存储空间的。 - 所以,Oracle 出现了 分区 extent 的概念:表示一系列连续的数据块集合。
SELECT * FROM dba_extents;
SELECT * FROM user_extents;
数据块 block
- 数据块 block 是 Oracle 数据信息的最小逻辑单元。
- 屏蔽了不同操作系统(Windows、Linux、Unix)的差异,全部数据操作采用对 Oracle 块的操作。
SQL> SHOW parameter db_block_size; -- 命令行 查询数据块大小
SQL> SHOW parameter db_file_multiblock_read_count; -- 一次从物理文件中读取数据块的数量