(8)ASSM
2018-05-31 本文已影响12人
sflovely1314
ASSM(automatic segment space management)自动空闲空间管理,实在Oracle 9i中首次被引入使用。在每个segment上会有一条freelist(或者多条,一般情况下一条就够用了)来管理空闲的block。使用block时,可能会根据需要把块放在freelist上或者从freelist上去除。只有位于hwm(高水位线)以下的对象块才会出现在freelist中,只有当freelist为空才会使用hwm之上的块,此时Oracle会推进hwm,并把这些块增加到freelist中。
ASSM的整体结构是3层位图块+数据块,如图。
FreeList一个L3块中可以存放多个L2块的地址,一个L2块可以存放多个L1块的地址,一个L1块可以存放多个数据库的地址。
第一个L3块一般是段头,如果段头存放了太多L2块的信息空间不足,则会再分配第二个L3块。
在数据插入时,如果需要申请空闲块,则会按照以下步骤进行:
1.查找数据字典,确定段头的位置;
2.在段头中找到第一个L2块的位置信息;
3.到L2块中根据执行插入操作进程的pid号做hash运算,得到一个随机数n,在L2中,找到第n个L1块的位置信息。
4.到第3步中确定的L1块中,再根据执行插入操作进程的pid号做hash运算,得到一个随机数m,在L1中找到第m号数据块。
5.向第m号数据库块中插入数据。
L3块中虽然有很多L2块,但插入的时候,每次只会选择同一个L2块,直到这个L2被插满了,才会选择下一个L2块。
在L2中选择L1时,对于不同的session,只要有可能,就会被分配到不同的L1中,在L1中查找数据块时也是一样。这也是Oracle宣称ASSM可以支持大并发插入的原因。