1. 程式人生 > >PostgreSQL系統表及其TOAST是如何定義的

PostgreSQL系統表及其TOAST是如何定義的

本文只是講PG怎樣定義系統表,而不是修改系統表甚至是定義自己的系統表。

PG系統表,比如:pg_class、pg_attribute、pg_type 等等
這幾個表相互關聯,後兩者要在pg_class記錄自己的表定義,而pg_class又需要在後兩者記錄自己的欄位和型別,看起來是個死扣。

關於它們怎麼定義,有興趣可以閱讀:
System Catalog Declarations and Initial Contents
比以前的文件更加細緻和明確,dat檔案的定義方式也比以前更清晰。

1、系統表資料結構定義,開啟 pg_class.h

CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,RelationRelation_Rowtype_Id) BKI_SCHEMA_MACRO
{
  NameData  relname;    /* class name */
  Oid      relnamespace;  /* OID of namespace containing this class */
  Oid      reltype;    /* OID of entry in pg_type for table's
                 * implicit row type */
  Oid      reloftype;    /* OID of entry in pg_type for underlying
                 * composite type */
...

pg_class 表結構

flying=# \d pg_class
                     Table "pg_catalog.pg_class"
       Column        |     Type     | Collation | Nullable | Default
---------------------+--------------+-----------+----------+---------
 relname             | name         |           | not null |
 relnamespace        | oid          |           | not null |
 reltype             | oid          |           | not null |
 reloftype           | oid          |           | not null |
...

是不是一一對應,事實上建表指令碼就是由這裡抽取生成,所以它們才如此一致。

2、src/backend/catalog/genbki.pl指令碼

這個Perl指令碼負責抽取定義並生成postgres.bki,有興趣可以結合上邊的文件理解它。

BKI指令碼由一個單獨的語法引擎支援,不是我們常說的SQL,它在bootstrap下,有興趣可以自己看,以後有機會再講。

3、程式碼

我們這裡只是看看PG怎麼做,並不是修改,每個定義都有其相應程式碼,它們在commands和catalog下。

後邊我會單獨寫一篇如何新增自己的系統欄位。

4、TOAST表

像text型別的欄位需要toast儲存,系統表的OID都是預置並且不允許修改,所以它們的TOAST同樣需要預設。

來看 src/include/catalog/toasting.h,以 pg_proc為例:

DECLARE_TOAST(pg_proc, 2836, 2837);

這個preprocessor是這樣定義的:

#define DECLARE_TOAST(name,toastoid,indexoid) extern int no_such_variable

看起來毫無意義對吧,其實它並不是真的給PG程式碼用,而是genbki,看過程式碼就知道怎麼回事。

5、索引

系統表也是需要索引的,定義在 src/include/catalog/indexing.h,還是以 pg_proc為例:

DECLARE_UNIQUE_INDEX(pg_proc_oid_index, 2690, on pg_proc using btree(oid oid_ops));
#define ProcedureOidIndexId  2690
DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, on pg_proc using btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops));
#define ProcedureNameArgsNspIndexId  2691

它有兩個索引,上邊的定義包括:名字、OID、am、欄位。

這些預處理符同樣不是給C程式碼準備的,只有genbki用得上。

6、初始資料

它們定義在同名的dat檔案裡,比如 pg_proc.dat。

7、欄位可選值

這個並不算表定義,但也是放在一起的,比如pg_proc的provolatile只允許:

#define PROVOLATILE_IMMUTABLE	'i' /* never changes for given input */
#define PROVOLATILE_STABLE		's' /* does not change within a scan */
#define PROVOLATILE_VOLATILE	'v' /* can change even within a scan */

歡迎關注我的公眾號,文章同步釋出。

相關推薦

PostgreSQL系統及其TOAST是如何定義

本文只是講PG怎樣定義系統表,而不是修改系統表甚至是定義自己的系統表。 PG系統表,比如:pg_class、pg_attribut

postgresql 系統

   表 pg_class  該系統表記錄了資料表、索引(仍然需要參閱pg_index)、序列、檢視、複合型別和一些特殊關係型別的元資料。 名字 型別 引用 描述 relname

系統學習hive programming,第四章----和資料庫定義

/* *    Lee 2013.11.12翻譯  《programming hive》 第四章節 Getting Started   @page表示 翻譯原文頁碼 */ @page 49   Hive 提供一種名為HSQL的方言, 不參考 ASCII SQL標準。 Hi

T-sql 查詢系統 獲取所有物件的定義sql語句

SELECT DISTINCT o.name AS Object_Name, o.type_desc FROM sys.sql_modules m INN

Postgresql查詢系統得到中列的型別

SELECTa.attname as "Column",pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"FROMpg_catalog.pg_attribute aWHEREa.attnum > 0

數據結構(嚴蔚敏、吳偉民)——讀書筆記-2、 線性及其基本運算、順序存儲結構

content pri 線性 時間復雜度 length 將他 ron 個數 p s 第二章 線性表 2.1 線性表及其基本運算 2.2 線性表的順序存儲結構 2.3 線性表的鏈式存儲結構 1、線性表:是n個數據元素的有限序列。

SQL Server常用系統

data pro 根據 結果 同時 最大 sys 次數 max 1、查詢當前數據庫中的用戶表 select *from sysobjects where xtype=‘U‘; 2、獲取SQL Server允許同時用戶連接的最大數 SELECT @@MAX_CONNECTIO

RAC中數據文件創建到了本地路徑(非系統空間) 使用rman轉移

over art get clas tro number ice log dev 環境: 11.2.0.1 + RHEL5.8 參考文檔ID:1678747.1 1.模擬創建 一節點: SQL> create tablespace tdb datafil

PostgreSQL空間

reat courier sin family 修改 postgre 索引 span 介質 在PostgreSQL中,表空間實際上是為表指定一個存儲目錄,這樣方便我們把不同的表放在不同的存儲介質或者文件系統中。在創建數據庫、表、索引時都可以指定表空間。 1. 創建表空間

線性及其實現(1)

結構 span 1.5 logs cnblogs 一元多項式 lin wid -s 線性表及其實現(1)   多項式的表示:   【例】一元多項式及其運算   一元多項式:   主要運算:多項式相加、相減、相乘等。   【分析】如何表示多項式?   ? 多項式項數n   

Oracle系統外鍵的更名

oracle教程 sof 麻煩 某個文件 const 刪除外鍵 詳細 浪費 拒絕 正在看的ORACLE教程是:Oracle系統表外鍵的更名。 Oracle中表的外鍵是保證系統參照完整性的手段,而參照完整性是指分布在兩個表中的列所滿足的具有主從性質的約束關系。外鍵涉及到兩個表

PostgreSQL系統列 System Columns

postgresql 系統列 system 每個表都有隱藏的系統列,創建表列的時候不能和系統列名相同,下面講解一下PostgreSQL有哪些系統列.(1)oid(4 bytes)object identifier(即object ID)主要用於系統表如pg_class(記錄table的一個表),p

監控linux的系統資源和自定義進程的cpu 內存占用。

until 分享 == lena filename src end available eve 1 #coding=utf8 2 import time 3 import psutil 4 from pprint import pprint 5 6 fro

日誌收集系統Flume及其應用

註意 內存緩存 外部 ner 流動 場景 啟動 net conf Apache Flume概述   Flume 是 Cloudera 提供的一個高可用的,高可靠的,分布式的海量日誌采集、聚合和傳輸的系統。Flume 支持定制各類數據發送方,用於收集各類型數據;同時,Flu

Mysql 5.7.20 mysql innodb 系統損壞帶來的問題

sha use linux系統 type log tle blob b- 資料 早上上班後,mysql服務器遇到點小問題,在排查故障過程查看mysql錯誤日誌過程中發現有幾個innodb 表無法打開,使用desc查看有關表的表結構提示表不存在,show tables 可以查

單自定義樣式

部分 鼠標滑過 獲取 四種 post click rst awesome -m 總結自定義表單樣式的控件,涉及到一些css偽類偽元素知識 css組合選擇符 css組合選擇符在自定義表單控件中扮演著連接的作用,便於控制元素樣式,css3中有四種組合選擇符。 後代選擇器 :以

哈希及其常用算法(代碼實例)

div 意義 imp ini insert HR 哈希函數 技術分享 sun <hash表的特性> Hash 表是使用 O(1) 時間進行數據的插入刪除和查找,但是 hash 表不保證表中數據的有序性,這樣在 hash 表中查找最大數據或者最小數據的時間

InnoDB數據字典詳解-系統

InnoDB 數據字典1、簡介 InnoDB中,實際上看不到系統表。有4個最基本的系統表來存儲表的元數據:表、列、索引、索引列等信息。這4個表分別是SYS_TABLES、SYS_COLUMNS、SYS_INDEXES、SYS_FIELDS。下面分別介紹 2、SYS_TABLES 存儲所有以InnoDB為存儲引

vue2.X+elementUI單自定義驗證

blur 條件 temp 通過 ren ber ima 這一 hone <template> <div class="taxi-appointment-dairen"> <el-form :model="ruleForm" :ru

C語言printf函數轉換說明及其修飾符

bsp splay int 函數轉換 isp 語言 auto mage 及其   ANSI C標準為printf( )提供的轉換說明 C語言printf函數轉換說明表及其修飾符表