物理结构
逻辑结构
数据库 -> 表空间 -> 段 -> 区 -> 块
先通过一个简单的例子,形象的展示一下上面这几个逻辑结构的关系
1、创建表空间:
SQL> create tablespace tb1 datafile '/ora/ora10g/data/tab_data1.dbf' size 100m;
Tablespace created.
2、已经看到了表空间TB1
SQL> select ts#,name from v$tablespace;
TS# NAME
---------- ------------------------------
0 SYSTEM
1 UNDOTBS1
2 SYSAUX
4 USERS
3 TEMP
6 EXAMPLE
7 TB1
3、再创建表,观察段与表空间的关系
SQL> create table status
2 (no varchar2(5) primary key,
3 name varchar2(10) null)
4 tablespace tb1;
4、此时查看dba_segments,很直接的就看到上面创建的表与主键索引的段
SQL> col owner for a10;
SQL> col segment_name for a12;
SQL> col segment_type for a12;
SQL> col tablespace_name for a15;
SQL> select owner,segment_name,segment_type,tablespace_name from dba_segments
2 where tablespace_name='TB1';
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
---------- ------------ ------------ ----------
SYS STATUS TABLE TB1
SYS SYS_C005425 INDEX TB1
由此可看到:
a) 表空间可包含多个段,即 表空间 -> 段
b) 段有所有者、名称、类型等属于,而且从后面的情况来看,这些属性都跟他对应的对象相同
c) 所以有时段与对象概念可互换
5、同时也可查到段所对应的对象,可以对象名称、类型、所有者与段相同
SQL> col object_type for a12;
SQL> col object_name for a12;
SQL> col object_id for a12;
SQL> col data_object_id for a12;
SQL> select object_type,object_name,object_id,data_object_id from user_objects
where object_name in ('STATUS','SYS_C005425');
OBJECT_TYPE OBJECT_NAME OBJECT_ID DATA_OBJECT_ID
------------ ------------ ---------- --------------
TABLE STATUS 52593 52593
INDEX SYS_C005425 52594 52594
区间的定义: 磁盘在使用过程中,IO对磁盘的写不仅只有数据库,还有其他程序,所以无法保证
所有数据地址都是连续的,所以便有了区间这个逻辑集合,它将不连续的数据地址
用连续的区间来存储,因为区间分配的连续性是oracle所能保证的,
6、通过dba_extents可看到段与区间的关系
a) 由于只是创建的测试表,也没任何数据,空间需求很小,所以这里看到段只有一个区间
但实际上段与区间是一对多的包含关系,但一个区间只能属于一个段
SQL> SELECT owner,segment_name,extent_id,file_id,block_id,bytes,blocks FROM DBA_EXTENTS where tablespace_name='TB1';
OWNER SEGMENT_NA EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
---------- ---------- ---------- ---------- ---------- ---------- ----------
SYS STATUS 0 6 9 65536 8
SYS SYS_C005425 0 6 17 65536 8