openGauss 内核分析(十):数据库索引的创建过程
openGauss 内核分析(十):数据库索引的创建过程
数据库索引可以提高数据的访问速度,openGauss 支持唯一索引、多字段索引、部分索引和表达式索引。行存表(ASTORE 存储引擎)支持的索引类型:btree(行存表缺省值)、hash、gin、gist。行存表(USTORE 存储引擎)支持的索引类型:ubtree。列存表支持的索引类型:Psort(列存表缺省值)、btree、gin。全局临时表不支持 GIN 索引和 Gist 索引。
如上一篇分析数据库表的创建过程,standard_ProcessUtility 函数会根据 nodeTag(parsetree)的值来确定 sql 的操作类型,create table 一般都是进入 T_CreateStmt 分支调用 CreateCommand 函数。create index 则进入 T_IndexStmt 分支调用 DefineIndex 函数。在调用 DefineIndex 前会首先执行函数 transformIndexStmt,如果语句没有指定索引类型则会使用缺省值。
普通表索引
DefineInde
DefineIndex 为创建索引主入口函数。通常创建索引以 Share 锁锁定表,允许并发查询,但禁上对表进行修改。如果创建索引时指定关键字 CONCURRENTLY 以不阻塞 DML 的方式创建索引,即允许读取和更新表,以 ShareUpdateExclusiveLock 锁锁定表。
如果没有指定索引名,ChooseIndexName 根据规则生成索引名:
为 index_create 函数构造参数 IndexInfo 结构体:
Index_create 函数创建索引:
关闭表并返回索引表 id:
Index_create****函数
打开系统表 pg_class:
heap_create 创建 relcache 和索引物理文件:
将索引表元信息存入系统表 pg_class:
将索引表元信息存入系统表 pg_index:
Index_build 建立索引:
index_build
index_build 调用 index_build_storage,如果创建的是 btree 索引最终调用 btbuild,如果是 hash 索引最终调用 hashbuild,如果是 psort 则最终调用 psortbuild,更多索引访问方法的信息可查看系统表 pg_am。
btree 索引的 procedure 为 btbuild。
以上函数调用栈如下:
分区表索引
创建普通表索引语法如下:
创建分区表索引语法:
两者执行流程基本一致,分区表索引在 DefineIndex 中是遍历每个分区调用 partition_index_create。
评论