標籤:
以前學習postgresql的筆記
create table 消耗 OID
如create table my_test_table, 他本身會消耗一個
會在pg_type中插入兩條記錄_my_test_table和my_test_table會消耗掉兩個oid
如果該表需要toast會產生一個改變的toast表和toast index表消耗另外兩個,查看過程如下:
create table my_test_table(a int, b char(8192));
select oid, relname from pg_class where relname=‘my_test_table‘;
-- oid = 16384
select oid, relname from pg_class where relname like ‘%16384%‘;
select typname, oid from pg_type where typname like ‘%my_test_table‘;
OID同步過程
OID同步原因:當建立表、視圖、函數等對象時,對象需要分配新的OID。建立對象的OID全
局唯一,因此要在所有的coordinator和datanode上擷取一個最大的OID。以create table為例,
具體流程如下:
1)首先和所有的dn及除自己以外的co建立串連。
2)向所有建立串連的節點發送擷取OID請求,收到請求的節點,把本節點最大的OID發給coordinator。
3)coordinator節點收到其他幾點發來的oid,選一個最大的oid,然後調用SetNextAssignObjectId
函數,使當前co節點下一個要分配的OID為叢集中最大的OID。
4)然後才執行create語句,結構體CreateStmt中成員TableOidInfo用來儲存擷取的最大的
OID,當前coordiator把查詢計劃下發到其它節點,其它節點擷取到最大OID後調用函數
heap_create_with_catalog,在自己節點上建立表
OID同步涉及到的系統資料表
pg_class
pg_namespace --create schema
pg_constraint
pg_operator
pg_ts_parser
pg_ts_dict
pg_ts_template
pg_ts_config
pg_collation
pg_am
pg_extension
pg_foreign_data_wrapper
pg_foreign_server
pg_user_mapping
pg_type
pg_enum
pg_proc
pg_rewrite
pg_trigger
pg_language
pg_conversion
pg_cast
pg_opfamily
pg_opclass
pg_tablespace
OID同步去除
當前實現可能存在問題是,當有節點或所有節點的OID迴繞了,建立對象非常有可能失敗。OID同步去除參考
PG-XL的做法,在查詢計劃中發送對象名,到節點上再轉成本地OID。
筆記 postgresql oid同步