
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。
文章转载自公众号:openGauss
