堆表采用了物理 ROWID 形式的堆表,DM 服务器内部对聚集索引进行了调整,没有采用传统 B 树结构,取而代之的是“扁平 B 树”,数据页都是通过链表形式存储。为支持并发插入,扁平 B 树可以支持最多 128 个数据页链表(最多 64 个并发分支和最多 64 个非并发分支),在 B 树的控制页中记录了所有链表的首、尾页地址。针对多个分支数,即存在多个链表时,并发分支和非并发分支的处理情况有所不同。对于并发分支,则各用户登录系统之后,会依据其事务 ID 号,随机选择一条链表来对堆表进行插入操作。因为是并发,所以可能出现多个用户选择了同一条分支的情况,此时用户需要排队,等待前一个用户插入结束并释放锁之后才能进行插入。在并发情况下,不同用户可以在不同的链表上进行插入,效率得到较大提升。对于非并发分支,则各用户按分支号从小到大选择一个可用的分支来进行插入。如果不存在空闲分支则需要等待其他用户释放锁之后才能进行插入。
堆表采用了物理 ROWID 形式的堆表,DM 服务器内部对聚集索引进行了调整,没有采用传统 B 树结构,取而代之的是“扁平 B 树”,数据页都是通过链表形式存储。为支持并发插入,扁平 B 树可以支持最多 128 个数据页链表(最多 64 个并发分支和最多 64 个非并发分支),在 B 树的控制页中记录了所有链表的首、尾页地址。针对多个分支数,即存在多个链表时,并发分支和非并发分支的处理情况有所不同。对于并发分支,则各用户登录系统之后,会依据其事务 ID 号,随机选择一条链表来对堆表进行插入操作。因为是并发,所以可能出现多个用户选择了同一条分支的情况,此时用户需要排队,等待前一个用户插入结束并释放锁之后才能进行插入。在并发情况下,不同用户可以在不同的链表上进行插入,效率得到较大提升。对于非并发分支,则各用户按分支号从小到大选择一个可用的分支来进行插入。如果不存在空闲分支则需要等待其他用户释放锁之后才能进行插入。