|
latch和lock的概念从实现上有什么不同?
我现在总算看懂了文章的一部分,
按我的理解,ASSM里面关键的应该是LEVEL2的块10
0x06800009 Free: 1 Inst: 1 --对应9
0x06800019 Free: 1 Inst: 1 --对应25
0x06800029 Free: 1 Inst: 1 --对应41
从这里可以得到多个Level1的类似块9的BitMapBlock列表.
通过这些BITMAP BLOCK,进程可以获取这个Bitmap Block所控制的data block以及修改该BitMap Block的bit.
因此我猜想Oracle可能是把这些BitMap Block按照一定算法独立分配给了多个Insert/Update进程,如果进程发现不够用了就申请下一个BitMapBlock;
如果BitmapBlock不够用了,就分配一个Extend,这个Extend里面也包含一个BitMap Block,然后修改Level2的最后一个指针指向这个BitMapBlock,我这样理解正确吗?
至于Level3...我猜测是Level2的BitMapBlock也不够空间了,就再分配一个Level2的Bitmap Block,然后把Level3 的最后一个指针指向新分配的Level2的BitMap Block
ps:以前看到biti,piner几位的数据块内部分析就头痛,因为经常dump block看到头晕 ,不过现在静下心来仔细研究一下确实能学到很多东西
最初由 biti_rainy 发布
[B]
assm 中 freelist 的功能被分散到多个 block中去了,甚至很多block中去了 。
以前freelist的header都是存放在segment header 中的 (freelist group > 1 也不过是一组freelist放一个block而已)
另: bitmap 的修改 比 freelist header 的修改速度快的多,不存在 锁 的问题,而是仅仅可能少量block存在着 cache buffer chain 的竞争 和 buffer pin 的竞争,这些都是 latch 一级而不是 lock 一级。
另: 和你第一个问题相关,若过多的block的剩余空间信息存储在同一个bitmap block中,则可能导致 cache buffer chain / buffer pin 等过度的latch的竞争从而导致和 freelist 一样的效果 。
我没确认是不是 一个 bitmap 任何情况下始终只保存 16个block的空间状态信息,bitmap也是一个树状的分级结构,是不是所有接点都这样没研究过,即使真的如此。 1/16 的空间,也不是什么太大的问题。 [/B] |
|