欢迎光临散文网 会员登陆 & 注册

openGauss内核分析(十):数据库索引的创建过程

2023-01-10 16:54 作者:Gauss松鼠会  | 我要投稿

数据库索引可以提高数据的访问速度,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,如果语句没有指定索引类型则会使用缺省值。

普通表索引

DefineIndex函数

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内核分析(十):数据库索引的创建过程的评论 (共 条)

分享到微博请遵守国家法律