l manual
Oracle 9i之前,我们只能以手工设定参数方式来确定哪个数据块可以用来进行插入操作。
该方式下,DBA为segment定义可用链表(freelist),freelist上挂的都是可以用来进行插入操作的数据块。该可用链表的起点记录在segment header里,也就是segment的第一个数据块里。当服务器进程进行插入而需要可用块时,先锁定segment header,然后在可用链表上搜索具有足够空间进行插入的可用数据块,找到该数据块后,将数据插入,最后释放对segment header的锁定。
在创建表或索引等segment时,我们可以指定两个参数:pctfree和pctused.
Pctfree表示数据块里剩余的可用空间占数据块总空间的百分比,该参数默认为10.pctused表示数据块里已经使用的空间占数据块总空间的百分比,该参数默认为 40%,当可用链表上的某个数据块不断被插入数据,从而导致该数据块里的剩余可用空间与数据块大小的百分比小于pctfree的值的时候,该数据块从可用链表上摘除,不能再用于插入操作。数据块从可用链表上摘下以后,剩余的可用空间将被更新操作所使用。因为对数据块里已经插入的数据的数据的更新可能会引起对可用空间的需求,比如对数据行中的某个列更新成更长的值。
当我们删除某个数据块上的数据,导致该数据块里已经使用的空间与数据块大小的百分比小于pctused的值的时候,则说明该数据块的可用空间足够多了,于是再次被挂到可用链表上。
当某个segment上的并发插入很严重的时候,由于搜索可用链表时只能由一个进程锁定segment header,因此其他要插入的进程就必须等待,从而出现segment header上的争用等待。
l automatic
自动段空间管理,简称ASSM(automatic segment space management),在oracle 9i引入。表示使用类似索引的结构管理segment中的数据块。为此,oracle引入了所谓的BMB块(bitmap blocks),这些BMB块与数据块一起,分布在整个segment里。
这些BMB块组织成类似索引树状的结构,一共三个层级:第一级BMB类似索引里的叶子节点,其中包含数据块的地址以及每个数据块的使用状态;第二级BMB则类似索引里的分支节点,其中包含第一个级BMB的地址,第三个BMB则类似索引里的根节点,其中包含第二级BMB块的地址。不过只有segment里的数据量非常大的时候才会分裂出第三级BMB。
引入了ASSM以后,使用多个BMB而不是可用链表,因此多个进程可以同时使用多个BMB进行并行的插入,从而有效地防止对segment header的争用等待。Oracle建议设置为ASSM。在ASSM的表空间里创建segment的时候,只能指定pctfree,而pctused、freelist等存储参数被忽略。
Enable logging
l YES:说明对该参数表空间里的表进行DML时都产生重做记录
l NO:说明对该表空间里的表进行DML时都不产生重做记录。这样做,可以加快DML的速度,但是不安全。