物理结构
块(block)-数据文件(data file)
逻辑结构
块(block)-区(extent)-段(segment)-表空间(tablespace)-库(database)
上面的块为2k,一般设置8k
单个扩展区不会跨数据文件,但是段可以包含多个数据文件。
块的结构
11g,插入一行,默认分配第一个区,没插数据,空表不分配区
10g,建好,默认分配1个区
块头和位图块
每个文件的前128(0-127)号块是文件头(11g),10g中是0-8号块。11里,0和1号块是真正的文件头,2-127号块是位图块。10g是1和1号块是文件头,2-8是位图块。
位图块用来记录表空间中区的分配的情况。位图块中的每个二进制位对应一个区是否被分配给表、索引等对象。第一个二进制位是0说明表空间的第一个区未分配,1就说明已分配,第二个二进制位对应第二个区。
位图块分2个部分,第一个位图块作为位图头(bitmapped file space header)
标记位
11g位图块2-127号,8x126=1008k字节,每个字节8个2进制,1008x1024x8=8257536个区。
800+w个二进制位中,如何判断哪个可以分配给表?
答案是使用标记位,如果0-2号区被占,那标记位的值为3,如果3-4也被占了,那标记位增加到5,此时2号区被释放了,那标记位变2.
如果需要分配新的区,从标记位开始找即可。假设当前标记位是5,有需要分配4个区,oracle就从5号区开始向下查找。
存疑
注意:
开启闪回drop,drop了表,区不会被释放,所以标记位不会下降,drop只是改名,并不会真正删除表。
统一区大小(设置区大小,指定extent 1m)
Create tablespace aaa datafile ‘/mp/abc.dbf’ size 50m uniform size 1m;
系统管理区大小
Create tablespace aaa datafile ‘/mp/abc.dbf’ size 50m reuse;
默认创建,不指定区大小,就是系统管理区大小。reuse是如果有相同名字,直接覆盖。
表大小,小于1m时,每个区64k,当表超过1m时,再分配新区,区大小将是1M。表再进一步变大,区大小会变8M。
由此可见,区大小随表的增大而增大。
统一区大小和系统管理区大小的选择
建议大多数情况,采用系统管理区大小(自动)。
如果某个表,明确知道他会变很大,建议直接建个统一区大小且区比较大的表空间。
和大文件(bigfile)不一样,这里是改区大小,大文件是块大小8k改32k这种。
大点的区建议8m
段中块的使用
(这个值得看看)
所有对象都有id,表和段都有id。
Dba_objects中,object_id是表的id,data_object_id是段的id。
比如建了个表,表的段id和表id是一样的初始。
表id建好不会变,但是段id会变,比如truncate表后,原本的段被删除,再为表建个新的段。也就是将表原本的存储空间释放,重新分配新的区(extent)。这个过程完毕,表就换了个段。
dba_objects里,object_id是对象id(表id) data_object_id是段id
select object_id,data_object_id from dba_objects where owner=‘DEF’ and object_name=‘F’;
删除某一行,然后回滚,块号、行号还是一样,说明删除某行只是在行上加了删除标志,声明该行空间可被覆盖。如果提交了后再插入,行的位置肯定发生变化。