1、实验,同一个表空间及数据文件上创建2个不同的表,通过dba_segments查看对应的段信息,注意此时的段类型是ASSM(默认一个表创建一个分区,一个分区最小创建8个块),如下图。

同时记得此时的HEADER_BLOCK分别为10242和10250。通过dba_extents查看对应的extent分区信息,如下:

可以看出此时extents的起始块分别是10240和10248。同上面的10242和10250少2个块。这2个块是做什么用的呢?
这里为分区头,不同对象(TMP_100和TMP_1000)对应第一个区的第一个块(block_id=10240或者10248)是FIRST LEVEL BITMAP BLOCK,第二个块(block_id=10241或者10249)是SECOND LEVEL BITMAP BLOCK,
这两个块是用来管理free block的,第三个块(block_id=10242和10250)是PAGETABLE SEGMENT HEADER,这里也没数据。这个块才是segment里的HEADER_BLOCK,再后面的块就是用来记录数据的。(即要从第四个块才有数据),
select rowid,dbms_rowid.rowid_relative_fno(rowid) || '_' ||dbms_rowid.rowid_block_number(rowid) || '_' || dbms_rowid.rowid_row_number(rowid) location from SALE.TMP_1000;
TMP_100如下,从10251才有:
TMP_1000如下:

同时也可以看出,一个分区一开始的默认分配的块个数是8个。并且都是分区开始算的。比如TMP_1000的第一个分区,即:10240开始算8个块,得最后的块ID10247。
此时由于新建了一个新表也叫段(TMP_100),ORACLE自动分配的第一个分区即从下一个空的块开始。如上面的10248~10255。下个分区的地址就是10256~10263,再下一个就是10264~10271等。
故此时的分区起始就是10248,它对应的段的起始块就是要+2后的10250.和上面图一对应.
当TMP_1000由于业务需要插入大量数据时,Oracle自动给它分配了一些连续的分区,如图二中可以看出,同时Oracle会预判断,像TCP的滑动窗口一样。后续就不会还是按照8个块一个分区,8个块一个分区一样进行分配块了。
而是一下子就分配多个连续块的大分区,如下图:128个块一个分区,连续的分区。分区也是自动管理。

总之,Oracle很厉害,很智能。记录只是加深一些记忆和理解。




