测试表Table_1
drop tablespace tbs_1 including contents and datafiles;
create tablespace tbs_1 datafile size 100M uniform size 1M;
create table table_1 tablespace tbs_1 as select * from scott.emp where 1=2;
select extent_id, file_id, block_id, blocks from dba_extents where segment_name='TABLE_1' order by extent_id;
select extent_id, file_id, block_id, blocks
from dba_extents
where segment_name='TABLE_1'
order by extent_id;
table_1表目前只包含一个区,它从6号文件的第128号块开始,大小为128个块。块大小为8KB,128个块,正好就是1MB。
0号、1号块是真正的文件头,2~127号块是位图块。(第一个位图块:位图段头;其他:真正的位图数据)
从128~257号块是table1的第一个区。
位图块中的每一个二进制位对应一个区是否被分配给某个表、索引等对象。如果第一个二进制位为0说明表空间中第一个区未分配,如果为1说明已分配;第二个二进制位对应第二个区,以此类推。
上面的二进制位就是位图块中的数据,下面表格表示区,其中灰色区是已分配区,白色区是未分配区。第1个区对应的二进制位是1,代表此区已分配,第2个区对应的二进制位是0,表示此区未分配,等等。位图块又分两部分,其中第一个位图块又被当作位图段头,可以在DUMP文件中找到Oracle对此块类型的说明:Bitmapped File Space Header。从第二个位图块也就是3号块开始,就是真正的位图数据了,DUMP文件中这些块的类型说明为:Bitmapped File Space Bitmap。
3~127号块是位图数据块,共125个位图块,每个字节8个二进制位,一共8192000个二进制位。每个二进制位对应一个区,一共就8192000个区。
在位图块中,找一个标记位,如果0~2号区被占用了,标记位的值为3;如果3~4号区又被占用了,标记位增加为5。假设此时2号区被释放了,标记位变为2。如果需要分配新的区,从这个标记位处开始查找即可。假设目前标记位值为5,有进程需要4个未分配区,Oracle就从5号区开始向下查找。
insert into table_1 select * from scott.emp;
select extent_id, file_id, block_id, blocks from dba_extents where segment_name='TABLE_1' order by extent_id;
select extent_id, file_id, block_id, blocks
from dba_extents
where segment_name='TABLE_1'
order by extent_id;
测试表LoadTest
select extent_id, file_id, block_id, blocks from dba_extents where segment_name='LOADTEST' order by extent_id;
select extent_id, file_id, block_id, blocks
from dba_extents
where segment_name='LOADTEST'
order by extent_id;
select min(extent_id), max(extent_id) from dba_extents where tablespace_name='TBS_1';
select min(extent_id), max(extent_id)
from dba_extents
where tablespace_name='TBS_1';
select segment_name, count(segment_name) from dba_extents where tablespace_name='TBS_1' group by segment_name;
select segment_name, count(segment_name)
from dba_extents
where tablespace_name='TBS_1'
group by segment_name;
居然没有数据哦!!!