oracle 表空间
物理结构 逻辑结构 数据库 -> 表空间 -> 段 -> 区 -> 块 先通过一个简单的例子,形象的展示一下上面这几个逻辑结构的关系 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