天天看點

openGauss核心分析(九):資料庫表的建立過程

作者:liwt

除了DML之外的所有查詢都通過ProcessUtility子產品來執行,包括了各類DDL語句、事務相關語句、遊标相關語句等。上層調用函數為exec_simple_query函數,其中PortalStart函數和PortalDrop函數部分較為簡單。核心函數是PortalRun函數下層調用的standard_ProcessUtility函數,該函數通過switch case語句處理了各種類型的查詢語句,包括事務相關查詢、遊标相關查詢、schema相關操作、表空間相關操作、表定義相關操作等。

standard_ProcessUtility函數會根據nodeTag(parsetree)的值來确定sql的操作類型,create table一般都是進入T_CreateStmt分支,調用CreateCommand函數。

openGauss核心分析(九):資料庫表的建立過程
openGauss核心分析(九):資料庫表的建立過程

CreateCommand函數先解析parse_tree擷取stmt,如果stmt為空則表明表已經存在。如果stmt不為空對stmts進行周遊,如果是CreateStmt就調用DefineRelation。AlterTableCreateToastTable判斷是否需要建立toast表并建立,AlterCStoreCreateTables判斷是否需要建立列存表并建立。

openGauss核心分析(九):資料庫表的建立過程

DefineRelation函數擷取到表名relname、名字空間relnamespace、表空間reltablespace、表類型relkind和relpersistence等資訊後調用heap_create_with_catalog建立relation。

openGauss核心分析(九):資料庫表的建立過程

heap_create_with_catalog主要完成表實體檔案的建立和表元資訊注冊到系統表中,涉及系統包包括pg_class,pg_attribute,pg_depend,pg_object,pg_type,pg_index和pg_partition。

openGauss核心分析(九):資料庫表的建立過程

其中heap_create内部首先調用了RelationBuildLocalRelation建立RelationData,并加入到relCache,RelationData表示一個表的元資訊,這些資訊都可以由系統表元組中的資訊構造得到。然後根據這些資訊通過調用RelalionCreateStorage函數建立實體檔案。

附:建立表create table的函數調用棧

openGauss核心分析(九):資料庫表的建立過程

繼續閱讀