定義
系統表的定義:
系統表是存放系統信息的普通表或者視圖
pg中總共包括56張系統表和23個系統視圖,系統視圖建立在系統表之上
系統表的創建
pg的每一個數據庫中都有一套自己的系統表,其中大多數系統表都是在數據庫創建時從模板數據庫中拷貝過來的
系統表的維護
系統表中的信息由sql命令關聯的系統表操作來自動維護
系統表的存儲方式
和數據庫相關的系統表保存在/data/base目錄下相應數據庫的文件夾下,文件夾命名為pg_database里記錄的數據庫oid
數據庫集群共享的系統表,如pg_database,保存在/data/global下
舉例:
系統在運行時對系統表的訪問會非常頻繁,為了提高性能,pg會在內存中建立共享系統表cache,使用hash函數和hash表去提高查詢效率
查看系統表
列出所有pg開頭的系統表
\dt pg_*
列出所有pg開頭的系統視圖
\dv pg_*
常用系統表
pg_database
系統中每創建一個database都會在pg_database中插入一行,這一行對應的oid就是數據庫的oid,刪除數據庫也會刪除對應的行
和大多數系統表不同的是,在一個集群里該表是所有數據庫共享的,即每個集群只有一份pg_database拷貝,而不是每個數據庫一份。
關鍵字段含義
名字 | 類型 | 引用 | 描述 |
datname | name | 數據庫名稱。 | |
datdba | oid | pg_authid.oid | 數據庫所有者,通常為創建該數據庫的角色。 |
encoding | int4 | 數據庫的字符編碼方式。 | |
datistemplate | bool | 如果為真,此數據庫可以用於CREATE DATABASE TEMPLATE子句,把新數據庫創建為此數據庫的克隆。 | |
datallowconn | bool | 如果為假,則沒有人可以聯接到這個數據庫。 | |
datlastsysoid | oid | 數據庫里最后一個系統OID,此值對pg_dump特別有用。 | |
datvacuumxid | xid | ||
datfrozenxid | xid | ||
dattablespace | text | pg_tablespace.oid | 該數據庫的缺省表空間。在這個數據庫里,所有pg_class.reltablespace為零的表都將保存在這個表空間里,特別要指出的是,所有非共享的系統表也都存放在這里。 |
datconfig | text[] | 運行時配置變量的會話缺省值。 | |
datacl | aclitem[] | 訪問權限。 |
pg_class
pg_class存儲表以及類似表的數據庫對象信息,包括索引,序列、視圖和復合數據類型等(也可以稱做--關系表)
系統中每創建一個表(視圖,索引,序列),都會在pg_class中自動插入一行,這一行的oid屬性就是該關系的oid
所有的系統表系統索引TOAST表,視圖,包括pg_class本身,都在pg_class中有對應的行
名字 | 類型 | 引用 | 描述 |
relname | name | 數據類型名字。 | |
relnamespace | oid | pg_namespace.oid | 包含這個對象的名字空間(模式)的OI。 |
reltype | oid | pg_type.oid | 對應這個表的行類型的數據類型。 |
relowner | oid | pg_authid.oid | 對象的所有者。 |
relam | oid | pg_am.oid | 對於索引對象,表示該索引的類型(B-tree,hash)。 |
relfilenode | oid | 對象存儲在磁盤上的文件名,如果沒有則為0。 | |
reltablespace | oid | pg_tablespace.oid | 對象所在的表空間。如果為零,則表示使用該數據庫的缺省表空間。(如果對象在磁盤上沒有文件,這個字段就沒有什么意義) |
relpages | int4 | 該數據表或索引所占用的磁盤頁面數量,查詢規划器會借助該值選擇最優路徑。 | |
reltuples | float4 | 表中行的數量,該值只是被規划器使用的一個估計值。 | |
reltoastrelid | oid | pg_class.oid | 與此表關聯的TOAST表的OID,如果沒有為0。TOAST表在一個從屬表里"離線"存儲大字段。 |
reltoastidxid | oid | pg_class.oid | 如果是TOAST表,該字段為它索引的OID,如果不是TOAST表則為0。 |
relhasindex | bool | 如果這是一個數據表而且至少有(或者最近有過)一個索引,則為真。它是由CREATE INDEX設置的,但DROP INDEX不會立即將它清除。如果VACUUM發現一個表沒有索引,那么它清理 relhasindex。 | |
relisshared | bool | 如果該表在整個集群中由所有數據庫共享,則為真。 | |
relkind | char | r = 普通表,i = 索引,S = 序列,v = 視圖, c = 復合類型,s = 特殊,t = TOAST表 | |
relnatts | int2 | 數據表中用戶字段的數量(除了系統字段以外,如oid)。在pg_attribute里肯定有相同數目的數據行。見pg_attribute.attnum. | |
relchecks | int2 | 表中檢查約束的數量,參閱pg_constraint表。 | |
reltriggers | int2 | 表中觸發器的數量;參閱pg_trigger表。 | |
relhasoids | bool | 如果我們為對象中的每行都生成一個OID,則為真。 | |
relhaspkey | bool | 如果該表存在主鍵,則為真。 | |
relhasrules | bool | 如表有規則就為真;參閱pg_rewrite表。 | |
relhassubclass | bool | 如果該表有子表,則為真。 | |
relacl | aclitem[] | 訪問權限。 |
pg_attribute
該系統表存儲所有表(包括系統表,如pg_class)的字段信息。數據庫中的每個表的每個字段在pg_attribute表中都有一行記錄。
系統中每個表都有唯一的oid。在每個表中,屬性都有唯一的編號,負數編號是系統屬性,正數編號是用戶定義的屬性。
名字 | 類型 | 引用 | 描述 |
attrelid | oid | pg_class.oid | 此字段所屬的表。 |
attname | name | 字段名。 | |
atttypid | oid | pg_type.oid | 字段的數據類型。 |
attstattarget | int4 | attstattarget控制ANALYZE為這個字段設置的統計細節的級別。零值表示不收集統計信息,負數表示使用系統缺省的統計對象。正數值的確切信息是和數據類型相關的。 | |
attlen | int2 | 該字段所屬類型的長度。(pg_type.typlen的拷貝) | |
attnum | int2 | 字段的編號,普通字段是從1開始計數的。系統字段,如oid,是任意的負數。 | |
attndims | int4 | 如果該字段是數組,該值表示數組的維數,否則是0。 | |
attcacheoff | int4 | 在磁盤上總是-1,但是如果裝載入內存中的行描述器中, 它可能會被更新為緩沖在行中字段的偏移量。 | |
atttypmod | int4 | 表示數據表在創建時提供的類型相關的數據(比如,varchar字段的最大長度)。其值對那些不需要atttypmod的類型而言通常為-1。 | |
attbyval | bool | pg_type.typbyval字段值的拷貝。 | |
attstorage | char | pg_type.typstorage字段值的拷貝。 | |
attalign | char | pg_type.typalign字段值的拷貝。 | |
attnotnull | bool | 如果該字段帶有非空約束,則為真,否則為假。 | |
atthasdef | bool | 該字段是否存在缺省值,此時它對應pg_attrdef表里實際定義此值的記錄。 | |
attisdropped | bool | 該字段是否已經被刪除。如果被刪除,該字段在物理上仍然存在表中,但會被分析器忽略,因此不能再通過SQL訪問。 | |
attislocal | bool | 該字段是否局部定義在對象中的。 | |
attinhcount | int4 | 該字段所擁有的直接祖先的個數。如果一個字段的祖先個數非零,那么它就不能被刪除或重命名。 |