7.2 区的管理
区是Oracle为数据库对象分配存储空间的基本单位。当用户创建表、索引、簇等数据库对象时,数据库服务器将为该对象对应的段分配若干个区,以存储该对象的数据。当段的空间被消耗完时,可以进行扩展,数据库服务器将为该段分配新的区。
当一个数据库对象被删除时,它所占用的区将被释放,数据库服务器负责回收这些区,并在适当的时机将这些空闲区分配给其他数据库对象。
7.2.1 区的分配
在本地管理表空间中,区的大小要么由数据库服务器自动指定,要么由数据库管理员指定。当在表空间中创建表、索引等数据库对象时,数据库服务器将按照指定的大小为段分配相应数量的区,在默认情况只分配一个初始区,尽管在这个区中还没有包含数据,但这个区不能分配给其他数据库对象。当初始区被写满后,数据库服务器将根据需要为段分配其他的区。
在表空间的每个数据文件的头部,都有一个位图,用来控制块的分配。当为段分配一个区时,数据库服务器将在位图中查找可用的数据块,将它们分配这个区。
首先我们执行下面的语句来创建本地管理表空间ts4:
SQL>CREATE TABLESPACE ts4
DATAFILE'/home/oracle/ts41..dbf'SIZE 10M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
由于采用了自动分配方式(AUTOALLOCATE),因此在表空间ts4中所有区的大小默认都是64KB。接下来我们在表空间ts4中创建表tab3:
SQL>CREATE TABLE tab3(col int)
TABLESPACE ts4;
这样将为段TAB3分配一个区,大小为64KB,占用8个数据块(每个数据块大小为8KB)。执行下面的查询语句,将得到为段TAB3分配得区的信息:
SQL>SELECT bytes, blocks, extents FROM dba_segments
WHERE segment_name='TAB3';
BYTES BLOCKS EXTENTS
65536 8 1
一个段所占用的区的详细信息可以通过查询数据字典DBA_EXTENTS获得。例如,下面的SELECT语句用于查询段TAB3所占用的区的ID、大小、区中所包含数据块的数目以及第一个数据块的ID:
SQL>SELECT extent_id, bytes/1024||'K'KBytes, blocks, block_id
FROM dba_extents
WHERE segment_name='TAB3';
EXTENT_ID BLOCK_ID KBYTES BLOCKS
0 17 64K 8