DM文档里创建索引部分的指引提到storage子句可指定branch、nobranch 、clusterbtr,其中BRANCH和NOBRANCH只能用以指定聚集索引。那么CREATE CLUSTER INDEX ... STORAGE(BRANCH)和CREATE NOT PARTIAL INDEX ... STORAGE(CLUSTERBTR)到底做了什么?在表级定义里,branch和nobranch是用来定义堆表,clusterbtr用来定义索引组织表,索引组织表没有并发分支的概念。而聚集索引是把数据行按索引列聚集,聚集索引即是表本身,就是普通B+树形式,不存在数据页链表,为什么能指定并发分支?什么意义?反过来普通索引的storage子句又能指定clusterbtr。怎么理解这两种创建索引的方式,求指教

• 索引定义语句的 STORAGE 子句中明确写到:“BRANCH 和 NOBRANCH 只能用以指定聚集索引”;
• 表级 STORAGE 中,BRANCH/NOBRANCH 是堆表创建关键字,指定堆表并发分支和非并发分支数目;CLUSTERBTR 则指定表为非堆表(普通 B 树表;
• 而堆表的本质是:“采用了物理 ROWID 形式的堆表,DM 服务器内部对聚集索引进行了调整,没有采用传统 B 树结构,取而代之的是‘扁平 B 树’,数据页都是通过链表形式存储”,为支持并发插入,扁平 B 树可支持最多 128 个数据页链表(64 并发 + 64 非并发分支;
• 同时堆表限制章节指出:堆表内部默认创建的聚集索引只是一个根页信息,堆表不允许显式建立传统意义上的聚集索引。
CREATE CLUSTER INDEX ... STORAGE(BRANCH) :
在 DM 的实现里,堆表不是没有聚集索引——它内部始终有一个聚集索引,只是这个“聚集索引”被改造成了扁平 B 树:控制页里记录 N 条数据页链表的首尾地址,插入时按分支选择链表 。所以:
• CREATE CLUSTER INDEX ... STORAGE(BRANCH (N,M)) = 把表数据按堆表方式组织,建立 N 条并发链表 + M 条非并发链表;
• 分支数的意义就是手册里说的:并发分支用于 FLDR、INSERT ... SELECT 等并发批量插入场景(不同事务随机选链表,冲突时排队),非并发分支用于单行插入场景(按分支号从小到大取空闲分支。