Postgresql系統表
概述
表名稱 | 用途 |
---|---|
pg_aggregate | 聚集函式 |
pg_am | 索引訪問方法 |
pg_amop | 訪問方法運算子 |
pg_amproc | 訪問方法支援過程 |
pg_attrdef | 欄位預設值 |
pg_attribute | 表的列(也稱為"屬性"或"欄位") |
pg_authid | 認證識別符號(角色) |
pg_auth_members | 認證識別符號成員關係 |
pg_autovacuum | 每個關係一個的自動清理配置引數 |
pg_cast | 轉換(資料型別轉換) |
pg_class | 表、索引、序列、檢視(“關係”) |
pg_constraint | 檢查約束、唯一約束、主鍵約束、外來鍵約束 |
pg_conversion | 編碼轉換資訊 |
pg_database | 本叢集內的資料庫 |
pg_depend | 資料庫物件之間的依賴性 |
pg_description | 資料庫物件的描述或註釋 |
pg_index | 附加的索引資訊 |
pg_inherits | 表繼承層次 |
pg_language | 用於寫函式的語言 |
pg_largeobject | 大物件 |
pg_listener | 非同步通知 |
pg_namespace | 模式 |
pg_opclass | 索引訪問方法運算子類 |
pg_operator | 運算子 |
pg_pltemplate | 過程語言使用的模板資料 |
pg_proc | 函式和過程 |
pg_rewrite | 查詢重寫規則 |
pg_shdepend | 在共享物件上的依賴性 |
pg_shdescription | 共享物件上的註釋 |
pg_statistic | 最佳化器統計 |
pg_tablespace | 這個資料庫叢集裡面的表空間 |
pg_trigger | 觸發器 |
pg_type | 資料型別 |
pg_aggregate
儲存與聚集函式有關的資訊。聚集函式是對一個數值集(通常每個匹配查詢條件的行中的一個欄位)進行操作的函式,它返回從這些值中計算出的一個數值。典型的聚集函式是 sum, count, max 。pg_aggregate 裡的每條記錄都是一條 pg_proc 裡面的記錄的擴充套件。pg_proc 記錄承載該聚集的名字、輸入和輸出資料型別,以及其它一些和普通函式類似的資訊。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
aggfnoid | regproc | pg_proc.oid | 此聚集函式的pg_proc OID |
aggtransfn | regproc | pg_proc.oid | 轉換函式 |
aggfinalfn | regproc | pg_proc.oid | 最終處理函式(如果沒有則為零) |
aggsortop | oid | pg_operator.oid | 關聯排序運算子(零或者無) |
aggtranstype | oid | pg_type.oid | 此聚集函式的內部轉換(狀態)資料的資料型別 |
agginitval | text | 轉換狀態的初始值。這是一個文字資料域,它包含初始值的外部字串表現形式。如果資料域是NULL,那麼轉換狀態值從NULL開始。 |
pg_am
pg_am 儲存有關索引訪問方法的資訊。系統支援的每種索引訪問方法都有一行。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
amname | name | 訪問方法的名字 | |
amstrategies | int2 | 這個訪問方法的運算子策略個數 | |
amsupport | int2 | 這個訪問方法的支援過程個數 | |
amorderstrategy | int2 | 如果索引不提供排序順序則為零,否則就是描述排序順序的策略運算子個數 | |
amcanunique | bool | 這種訪問方式是否支援唯一索引? | |
amcanmulticol | bool | 這種訪問方式是否支援多欄位索引? | |
amoptionalkey | bool | 這個訪問訪法支援在一個索引欄位上沒有任何約束的掃描嗎? | |
amindexnulls | bool | 這種訪問方式是否支援 NULL 索引記錄? | |
amstorage | bool | 允許索引儲存的資料型別與列的資料型別不同? | |
amclusterable | bool | 允許在一個這種型別的索引上群集? | |
aminsert | regproc | pg_proc.oid | "插入這個行"函式 |
ambeginscan | regproc | pg_proc.oid | "開始新掃描"函式 |
amgettuple | regproc | pg_proc.oid | "下一個有效行"函式 |
amgetmulti | regproc | pg_proc.oid | "抓取多個行"函式 |
amrescan | regproc | pg_proc.oid | "重新開始這個掃描"函式 |
amendscan | regproc | pg_proc.oid | "結束這次掃描"函式 |
ammarkpos | regproc | pg_proc.oid | "標記當前掃描位置"函式 |
amrestrpos | regproc | pg_proc.oid | "恢復已標記的掃描位置"函式 |
ambuild | regproc | pg_proc.oid | "建立新索引"函式 |
ambulkdelete | regproc | pg_proc.oid | 批次刪除函式 |
amvacuumcleanup | regproc | pg_proc.oid | VACUUM 後的清理函式 |
amcostestimate | regproc | pg_proc.oid | 估計一個索引掃描開銷的函式 |
amoptions | regproc | pg_proc.oid | 為一個索引分析和確認 reloptions 的函式 |
pg_amop
pg_amop 表儲存有關和索引訪問方法運算子類關聯的資訊。如果一個運算子是一個運算子類中的成員,那麼在這個表中會佔據一行。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
amopclaid | oid | pg_opclass.oid | 這條記錄表示的索引運算子類 |
amopsubtype | oid | pg_type.oid | 區分一個策略的多條記錄的子型別,預設為零 |
amopstrategy | int2 | 運算子策略數 | |
amopreqcheck | bool | 索引命中必須重新檢查 | |
amopopr | oid | pg_operator.oid | 該運算子的 OID |
pg_amproc
pg_amproc 儲存有關與索引訪問方法運算子類相關聯的支援過程的資訊。每個屬於某個運算子類的支援過程都佔有一行。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
amopclaid | oid | pg_opclass.oid | 使用這條記錄的索引運算子類 |
amprocsubtype | oid | pg_type.oid | 如果是跨型別的過程,就是子型別,否則就是零 |
amprocnum | int2 | 支援過程編號 | |
amproc | regproc | pg_proc.oid | 過程的 OID |
pg_attrdef
pg_attrdef 表儲存欄位預設值。欄位的主要資訊存放在 pg_attribute。只有明確宣告一個預設值(該表何時建立或欄位何時增加)的欄位在這裡有行。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
adrelid | oid | pg_class.oid | 這個欄位所屬的表 |
adnum | int2 | pg_attribute.attnum | 欄位數目 |
adbin | text | 欄位預設值的內部表現形式 | |
adsrc | text | 人類可讀的預設值的內部表現形式 |
adsrc 是歷史遺留,最好不要使用它,因為它並未跟蹤可能影響預設值表現形式的外部變化。反編譯 adbin 欄位(比如,用 pg_get_expr)是更好的顯示預設值的方法。
pg_attribute
pg_attribute 表儲存關於表的欄位的資訊。資料庫裡每個表的每個欄位都在 pg_attribute 裡有一行。還有用於索引,以及所有在 pg_class 裡有記錄的物件。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
attrelid | oid | pg_class.oid | 此欄位所屬的表 |
attname | name | 欄位名字 | |
atttypid | oid | pg_type.oid | 這個欄位的資料型別 |
attstattarget | int4 | 控制 ANALYZE 為這個欄位積累的統計細節的級別。零值表示不收集統計資訊。負數表示使用系統預設的統計物件。正數值的確切資訊是和資料型別相關的。對於標量資料型別,attstattarget 既是要收集的"最常用數值"的目標數目,也是要建立的柱狀圖的目標數量。 | |
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 的複製。對於可壓縮的資料型別(TOAST),這個欄位可以在欄位建立之後改變,以便於控制儲存策略。 | |
attalign | char | 這個欄位型別的 pg_type.typalign 的複製 | |
attnotnull | bool | 這代表一個非空約束。可以改變這個欄位以開啟或者關閉這個約束。 | |
atthasdef | bool | 這個欄位有一個預設值,此時它對應 pg_attrdef 表裡實際定義此值的記錄。 | |
attisdropped | bool | 這個欄位已經被刪除了,不再有效。一個已經刪除的欄位物理上仍然存在表中,但會被分析器忽略,因此不能再透過 SQL 訪問。 | |
attislocal | bool | 這個欄位是區域性定義在關係中的。請注意一個欄位可以同時是區域性定義和繼承的。 | |
attinhcount | int4 | 這個欄位所擁有的直接祖先的個數。如果一個欄位的祖先個數非零,那麼它就不能被刪除或重新命名。 |
在一個已被刪除欄位的 pg_attribute 記錄裡,atttypid 將被重置為零,但是 attlen 和其它從 pg_type 複製的仍然有效。這麼安排是為了對付後來被刪除的欄位的資料型別也被刪除的情況,因為這個時候不再有 pg_type 行了。attlen 和其它欄位可以用於解析表中一行內容。
pg_authid
pg_authid 包含有關資料庫認證識別符號(角色)的資訊。一個角色體現"使用者"和"組"的概念。一個使用者實際上只是一個設定了 rolcanlogin 標誌的角色。任何角色(不管設定了 rolcanlogin)標誌)都可以有其它角色做為成員;參閱 pg_auth_members
因為這個系統表包含口令,所以它不是公共可讀的。pg_roles 是一個在 pg_authid 上的檢視,只是把口令域填成了空白。
因為使用者標識是叢集範圍的,pg_authid 在一個叢集裡所有的資料庫之間是共享的:每個叢集只有一個 pg_authid 複製,而不是每個資料庫一個。
名字 | 型別 | 描述 |
---|---|---|
rolname | name | 角色名稱 |
rolsuper | bool | 角色擁有超級使用者許可權 |
rolinherit | bool | 角色自動繼承其所屬角色的許可權 |
rolcreaterole | bool | 角色可以建立更多角色 |
rolcreatedb | bool | 角色可以建立資料庫 |
rolcatupdate | bool | 角色可以直接更新系統表。如果沒有設定這個欄位為真,即使超級使用者也不能這麼做。 |
rolcanlogin | bool | 角色可以登入,也就是說,這個角色可以給予會話認證識別符號。 |
rolconnlimit | int4 | 對於可以登入的角色,限制其最大併發連線數量。-1 表示沒有限制。 |
rolpassword | text | 口令(可能是加密的);如果沒有則為 NULL |
rolvaliduntil | timestamptz | 口令失效時間(只用於口令認證);如果沒有失效期,則為 NULL |
rolconfig | text[] | 執行時配置變數的會話預設 |
pg_auth_members
pg_auth_members 顯示角色之間的成員關係。任何非閉環的關係集合都是允許的。
因為使用者標識是叢集範圍的,pg_auth_members 是在一個叢集裡的所有資料庫之間共享的:每個叢集裡只有一個 pg_auth_members 複製,而不是每個資料庫一個。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
roleid | oid | pg_authid.oid | 擁有有成員的角色的 ID |
member | oid | pg_authid.oid | 屬於 roleid 角色的一個成員的角色的 ID |
grantor | oid | pg_authid.oid | 賦予此成員關係的角色的 ID |
admin_option | bool | 如果 member 可以把 roleid 角色的成員關係賦予其它角色,則為真。 |
pg_autovacuum
pg_autovacuum 為 autovacuum 守護程序儲存針對每個關係的配置引數,給出的引數將用於自動清理該表。如果沒有提供條目,那麼使用系統範圍的預設。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
vacrelid | oid | pg_class.oid | 此條記錄用於的表 |
enabled | bool | 如果為假,該表從不會被自動清理 | |
vac_base_thresh | integer | 清理前修改的最少的行數目 | |
vac_scale_factor | float4 | 追加到 vac_base_thresh 上的行的倍數 | |
anl_base_thresh | integer | 分析之前修改的最少的行數目 | |
anl_scale_factor | float4 | 追加到 anl_base_thresh 上的行的倍數 | |
vac_cost_delay | integer | 自定義的 vacuum_cost_delay 引數 | |
vac_cost_limit | integer | 自定義的 vacuum_cost_limit 引數 | |
freeze_min_age | integer | 自定義的 vacuum_freeze_min_age 引數 | |
freeze_max_age | integer | 自定義的 autovacuum_freeze_max_age 引數 |
pg_cast
pg_cast 表儲存資料型別轉換路徑,包括內建路徑和那些透過 CREATE CAST 定義的路徑。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
castsource | oid | pg_type.oid | 源資料型別的 OID |
casttarget | oid | pg_type.oid | 目標資料型別的 OID |
castfunc | oid | pg_proc.oid | 用於執行這個轉換的函式的 OID 。如果該資料型別是二進位制相容的,那麼為零(也就是說,不需要執行時的操作來執行轉換)。 |
castcontext | char | 標識這個轉換可以在什麼環境裡呼叫。e 表示只能進行明確的轉換(使用 CAST 或 :: 語法)。a 表示在賦值給目標欄位的時候隱含呼叫,也可以明確呼叫。i 表示在表示式中隱含,當然也包括其它情況。 |
在 pg_cast 裡列出的型別轉換函式必須總是以型別轉換的源型別作為它的第一個引數型別,並且返回型別轉換的目的型別作為它的結果型別。一個型別轉換函式最多有三個引數。如果出現了第二個引數,必須是 integer 型別;它接受與目標型別關聯的修飾詞,如果沒有,就是 -1 。如果出現了第三個引數,那麼必須是 boolean 型別;如果該型別轉換是一種明確的轉換,那麼它接受 true ,否則接受 false 。
在 pg_cast 裡建立一條源型別和目標型別相同的記錄是合理的,只要相關聯的函式接受多過一個引數。這樣的記錄代表"長度轉換函式",他們把該型別的數值轉換為對特定的型別修飾詞數值合法的值。不過,請注意,現在還不支援將非預設型別修飾詞和使用者建立資料型別關聯起來,因此這個設施只用於少量的內建型別,這些型別都有內建於語法分析器裡的型別修飾詞語法。
如果一條 pg_cast 記錄有著不同的原型別和目標型別,並且有一個接收多於一個引數的函式,那麼它就意味著用一個步驟從一種型別轉換到另外一種型別,同時還附加一個長度轉換。如果沒有這樣的記錄,那麼轉換成一個使用了型別修飾詞的型別涉及兩個步驟,一個是在資料型別之間轉換,另外一個是附加修飾詞。
pg_class
pg_class 表記載表和幾乎所有有欄位或者是那些類似表的東西。包括索引(不過還要參閱 pg_index)、序列、檢視、複合型別和一些特殊關係型別;參閱 relkind 。在下面,當指所有這些物件的時候說"關係"(relations)。不是所有欄位對所有關係型別都有意義。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
relname | name | 表、索引、檢視等的名字。 | |
relnamespace | oid | pg_namespace.oid | 包含這個關係的名字空間(模式)的 OID |
reltype | oid | pg_type.oid | 對應這個表的行型別的資料型別(索引為零,它們沒有 pg_type 記錄)。 |
relowner | oid | pg_authid.oid | 關係所有者 |
relam | oid | pg_am.oid | 如果行是索引,那麼就是所用的訪問模式(B-tree, hash 等等) |
relfilenode | oid | 這個關係在磁碟上的檔案的名字,如果沒有則為 0 | |
reltablespace | oid | pg_tablespace.oid | 這個關係儲存所在的表空間。如果為零,則意味著使用該資料庫的預設表空間。如果關係在磁碟上沒有檔案,則這個欄位沒有什麼意義。 |
relpages | int4 | 以頁(大小為 BLCKSZ)的此表在磁碟上的形式的大小。它只是規劃器用的一個近似值,是由 VACUUM, ANALYZE 和幾個 DDL 命令,比如 CREATE INDEX 更新。 | |
reltuples | float4 | 表中行的數目。只是規劃器使用的一個估計值,由 VACUUM, ANALYZE 和幾個 DDL 命令,比如 CREATE INDEX 更新。 | |
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 | 如果該表在整個叢集中由所有資料庫共享則為真。只有某些系統表(比如 pg_database)是共享的。 | |
relkind | char | r = 普通表, i = 索引, S = 序列, v = 檢視, c = 複合型別, t = TOAST 表 | |
relnatts | int2 | 關係中使用者欄位數目(除了系統欄位以外)。在 pg_attribute 裡肯定有相同數目對應行。又見 pg_attribute.attnum | |
relchecks | int2 | 表裡的檢查約束的數目;參閱 pg_constraint 表 | |
reltriggers | int2 | 表裡的觸發器的數目;參閱 pg_trigger 表 | |
relukeys | int2 | 未使用(不是唯一值的數目) | |
relfkeys | int2 | 未使用(不是表中外來鍵的數目) | |
relrefs | int2 | 未使用 | |
relhasoids | bool | 如果為關係中每行都生成一個 OID 則為真 | |
relhaspkey | bool | 如果這個表有一個(或者曾經有一個)主鍵,則為真。 | |
relhasrules | bool | 如表有規則就為真;參閱 pg_rewrite 表 | |
relhassubclass | bool | 如果有(或者曾經有)任何繼承的子表,為真。 | |
relfrozenxid | xid | 該表中所有在這個之前的事務 ID 已經被一個固定的(“frozen”)事務 ID 替換。這用於跟蹤該表是否需要為了防止事務 ID 重疊或者允許收縮 pg_clog 而進行清理。如果該關係不是表則為零(InvalidTransactionId)。 | |
relacl | aclitem[] | 訪問許可權。參閱 GRANT 和 REVOKE 獲取詳細資訊。 | |
reloptions | text[] | 訪問方法特定的選項,使用"keyword=value"格式的字串 |
pg_constraint
pg_constraint 儲存表上的檢查約束、主鍵、唯一約束和外來鍵約束。欄位約束不會得到特殊對待。每個欄位約束都等效於某些表約束。非空約束記錄在 pg_attribute 表中。
在域上面的檢查約束也儲存在這裡。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
conname | name | 約束名字(不一定是唯一的) | |
connamespace | oid | pg_namespace.oid | 包含這個約束的名字空間的 OID |
contype | char | c = 檢查約束, f = 外來鍵約束, p = 主鍵約束, u = 唯一約束 | |
condeferrable | bool | 這個約束可以推遲嗎? | |
condeferred | bool | 預設時這個約束是否推遲的? | |
conrelid | oid | pg_class.oid | 這個約束所在的表;如果不是表約束則為 0 |
contypid | oid | pg_type.oid | 這個約束所在的域;如果不是一個域約束則為 0 |
confrelid | oid | pg_class.oid | 如果是外來鍵,則為參考的表;否則為 0 |
confupdtype | char | 外來鍵更新動作程式碼 | |
confdeltype | char | 外來鍵刪除動作程式碼 | |
confmatchtype | char | 外來鍵匹配型別 | |
conkey | int2[] | pg_attribute.attnum | 如果是表約束,則是約束控制的欄位列表 |
confkey | int2[] | pg_attribute.attnum | 如果是一個外來鍵,是參考的欄位的列表 |
conbin | text | 如果是檢查約束,那就是其表示式的內部形式 | |
consrc | text | 如果是檢查約束,則是表示式的人類可讀形式 |
【注意】 consrc 在被引用的物件改變之後不會被更新,它不會跟蹤欄位的名字修改。與其依賴這個欄位,最好還是使用 pg_get_constraintdef() 來抽取一個檢查約束的定義。
【注意】 pg_class.relchecks 需要和在此表上為給定關係找到的檢查約束的數目一致。
pg_conversion
pg_conversion 描述可用的編碼轉換資訊。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
conname | name | 轉換名字(在一個名字空間裡是唯一的) | |
connamespace | oid | pg_namespace.oid | 包含這個轉換的名字空間的 OID |
conowner | oid | pg_authid.oid | 編碼轉換的屬主 |
conforencoding | int4 | 源編碼 ID | |
contoencoding | int4 | 目的編碼 ID | |
conproc | regproc | pg_proc.oid | 轉換過程 |
condefault | bool | 如果這是預設轉換則為真 |
pg_database
pg_database 表儲存關於可用資料庫的資訊。和大多數系統表不同,pg_database 是在一個叢集裡的所有資料庫共享的:每個叢集只有一份 pg_database 複製,而不是每個資料庫一份。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
datname | name | 資料庫名字 | |
datdba | oid | pg_authid.oid | 資料庫所有人,通常為其建立者 |
encoding | int4 | 資料庫的字元編碼方式(pg_encoding_to_char() 能夠將這個數字轉換為相應的編碼名稱) | |
datistemplate | bool | 如果為真則此資料庫可以用於 CREATE DATABASE 的 TEMPLATE 子句,把新資料庫建立為此資料庫的克隆。 | |
datallowconn | bool | 如果為假則沒有人可以連線到這個資料庫。這個欄位用於保護 template0 資料庫不被更改。 | |
datconnlimit | int4 | 設定該資料庫上允許的最大併發連線數,-1 表示無限制。 | |
datlastsysoid | oid | 資料庫裡最後一個系統 OID ;對 pg_dump 特別有用。 | |
datfrozenxid | xid | 該資料庫中中所有在這個之前的事務 ID 已經被一個固定的(“frozen”)事務 ID 替換。這用於跟蹤該資料庫是否需要為了防止事務 ID 重疊或者允許收縮 pg_clog 而進行清理。它是針對每個表的 pg_class.relfrozenxid 中的最小值。 | |
dattablespace | oid | pg_tablespace.oid | 該資料庫的預設表空間。在這個資料庫裡,所有 pg_class.reltablespace 為零的表都將儲存在這個表空間裡;特別要指出的是,所有非共享的系統表也都存放在這裡。 |
datconfig | text[] | 執行時配置變數的會話預設值 | |
datacl | aclitem[] | 訪問許可權。 |
pg_depend
pg_depend 表記錄資料庫物件之間的依賴關係。這個資訊允許 DROP 命令找出哪些其它物件必須由 DROP CASCADE 刪除,或者是在 DROP RESTRICT 的情況下避免刪除。
這個表的功能類似 pg_shdepend ,用於記錄那些在資料庫叢集之間共享的物件之間的依賴性關係。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
classid | oid | pg_class.oid | 有倚賴物件所在系統表的 OID |
objid | oid | 任何 OID 屬性 | 指定的有依賴物件的 OID |
objsubid | int4 | 對於表欄位,這個是該屬性的欄位數(objid 和 classid 引用表本身)。對於所有其它物件型別,目前這個欄位是零。 | |
refclassid | oid | pg_class.oid | 被引用物件所在的系統表的 OID |
refobjid | oid | 任意 OID 屬性 | 指定的被引用物件的 OID |
refobjsubid | int4 | 對於表欄位,這個是該欄位的欄位號(refobjid 和 refclassid 引用表本身)。對於所有其它物件型別,目前這個欄位是零。 | |
deptype | char | 一個定義這個依賴關係特定語義的程式碼。 |
在所有情況下,一個 pg_depend 記錄表示被引用的物件不能在有依賴的物件被刪除前刪除。不過,這裡還有幾種由 deptype 定義的情況:
-
DEPENDENCY_NORMAL (n)
獨立建立的物件之間的一般關係。有倚賴的物件可以在不影響被引用物件的情況下刪除。被引用物件只有在宣告瞭 CASCADE 的情況下刪除,這時有依賴的物件也被刪除。例子:一個表欄位對其資料型別有一般依賴關係。
-
DEPENDENCY_AUTO (a)
有依賴物件可以和被引用物件分別刪除,並且如果刪除了被引用物件則應該被自動刪除(不管是 RESTRICT 或 CASCADE 模式)。例子:一個表上面的命名約束是在該表上的自動依賴關係,因此如果刪除了表,它也會被刪除。
-
DEPENDENCY_INTERNAL (i)
有依賴的物件是作為被引用物件的一部分建立的,實際上只是它的內部實現的一部分。DROP 有依賴物件是不能直接允許的(將告訴使用者發出一條刪除被引用物件的 DROP)。一個對被引用物件的 DROP 將傳播到有依賴物件,不管是否宣告瞭 CASCADE 。例子:一個建立來強制外來鍵約束的觸發器在該約束的 pg_constraint 記錄上是標記為內部依賴的。
-
DEPENDENCY_PIN §
沒有有依賴物件;這種型別的記錄標誌著系統本身依賴於被引用物件,因此這個物件決不能被刪除。這種型別的記錄只有在 initdb 的時候建立。有依賴物件的欄位裡是零。
將來可能還會有其它依賴的風格。
pg_description
pg_description 表可以給每個資料庫物件儲存一個可選的描述(註釋)。你可以用 COMMENT 命令操作這些描述,並且可以用 psql 的 \d 命令檢視。許多內建的系統物件的描述提供了 pg_description 的初始內容。
pg_shdescription 提供了類似的功能,它記錄了整個叢集範圍內共享物件的註釋。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
objoid | oid | 任意 oid 屬性 | 這條描述所描述的物件的 OID |
classoid | oid | pg_class.oid | 這個物件出現的系統表的 OID |
objsubid | int4 | 對於一個表欄位的註釋,它是欄位號(objoid 和 classoid 指向表自身)。對於其它物件型別,它是零。 | |
description | text | 作為對該物件的描述的任意文字 |
pg_index
pg_index 包含關於索引的一部分資訊。其它的資訊大多數在 pg_class。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
indexrelid | oid | pg_class.oid | 這個索引在 pg_class 裡的記錄的 OID |
indrelid | oid | pg_class.oid | 使用這個索引的表在 pg_class 裡的記錄的 OID |
indnatts | int2 | 索引中的欄位數目(複製的 pg_class.relnatts) | |
indisunique | bool | 如果為真,這是個唯一索引 | |
indisprimary | bool | 如果為真,該索引代表該表的主鍵。這個欄位為真的時候 indisunique 應該總是為真。 | |
indisclustered | bool | 如果為真,那麼該表最後在這個索引上建了簇。 | |
indisvalid | bool | 如果為真,那麼該索引可以用於查詢。如果為假,那麼該索引可能不完整,仍然必須在 INSERT/UPDATE 操作時進行更新,不過不能安全的用於查詢。如果是唯一索引,那麼唯一屬性也將不為真。 | |
indkey | int2vector | pg_attribute.attnum | 這是一個包含 indnatts 值的陣列,這些陣列值表示這個索引所建立的表欄位。比如一個值為 1 3 的意思是第一個欄位和第三個欄位組成這個索引鍵字。這個陣列裡的零表明對應的索引屬性是在這個表欄位上的一個表示式,而不是一個簡單的欄位引用。 |
indclass | oidvector | pg_opclass.oid | 對於索引鍵字裡面的每個欄位,這個欄位都包含一個指向所使用的運算子類的 OID ,參閱 pg_opclass 獲取細節。 |
indexprs | text | 表示式樹(以 nodeToString() 形式表現)用於那些非簡單欄位引用的索引屬性。它是一個列表,在 indkey 裡面的每個零條目一個元素。如果所有索引屬性都是簡單的引用,則為空。 | |
indpred | text | 部分索引斷言的表示式樹(以 nodeToString() 的形式表現)。如果不是部分索引,則是空字串。 |
pg_inherits
pg_inherits 記錄關於表繼承層次的資訊。資料庫裡每個直接的子系表都有一條記錄。間接的繼承可以透過追溯記錄鏈來判斷。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
inhrelid | oid | pg_class.oid | 子表的 OID |
inhparent | oid | pg_class.oid | 父表的 OID |
inhseqno | int4 | 如果一個子表存在多個直系父表(多重繼承),這個數字表明此繼承欄位的排列順序。計數從 1 開始。 |
pg_language
pg_language 登記程式語言,你可以用這些語言或介面寫函式或者儲存過程。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
lanname | name | 語言的名字 | |
lanispl | bool | 對於內部語言而言是假(比如 SQL),對於使用者定義的語言則是真。目前,pg_dump 仍然使用這個東西判斷哪種語言需要轉儲,但是這些可能在將來被其它機制取代。 | |
lanpltrusted | bool | 如果這是可信語言則為真,意味著系統相信它不會被授予任何正常 SQL 執行環境之外的許可權。只有超級使用者可以建立不可信的語言。 | |
lanplcallfoid | oid | pg_proc.oid | 對於非內部語言,這是指向該語言處理器的引用,語言處理器是一個特殊函式,負責執行以某種語言寫的所有函式。 |
lanvalidator | oid | pg_proc.oid | 這個欄位引用一個語言校驗器函式,它負責檢查新建立的函式的語法和有效性。如果沒有提供校驗器,則為零。 |
lanacl | aclitem[] | 訪問許可權。 |
pg_largeobject
pg_largeobject 表儲存那些標記著"大物件"的資料。一個大物件是使用其建立時分配的 OID 標識的。每個大物件都分解成足夠小的小段或者"頁面"以便以行的形式儲存在 pg_largeobject 裡。每頁的資料定義為 LOBLKSIZE(目前是 BLCKSZ/4 或者通常是 2K 位元組)。
名字 | 型別 | 描述 |
---|---|---|
loid | oid | 包含本頁的大物件的識別符號 |
pageno | int4 | 本頁在其大物件資料中的頁碼從零開始計算 |
data | bytea | 儲存在大物件中的實際資料。這些資料絕不會超過 LOBLKSIZE 位元組,而且可能更少。 |
pg_listener
pg_listener 表支援LISTEN命令。一個監聽器為它監聽的每個通知名稱在 pg_listener 裡建立一條記錄。一個通知發起人掃描 pg_listener 並且更新每條匹配的記錄以顯示一個通知已經發生。通知發起人還傳送一個訊號給監聽器(使用記錄在表中的 PID)以喚醒它做處理。
名字 | 型別 | 描述 |
---|---|---|
relname | name | 通知條件名。該名字不需要匹配任何資料庫中的實際關係;項 relname 是歷史原因形成的。 |
listenerpid | int4 | 建立此條目的伺服器程序的 PID |
notification | int4 | 如果這個監聽器上沒有等待的事件,那麼是零。如果有等待的事件,那麼是傳送通知的伺服器的 PID |
pg_namespace
pg_namespace 儲存名字空間。名字空間是 SQL 模式下層的結構:每個名字空間有獨立的關係,型別等集合但並不會相互衝突。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
nspname | name | 名字空間的名字 | |
nspowner | oid | pg_authid.oid | 名字空間的所有者 |
nspacl | aclitem[] | 訪問許可權 |
pg_opclass
pg_opclass 定義索引訪問方法運算子類。每個運算子類為一種特定資料型別和一種特定索引訪問方法定義索引欄位的語義。請注意對於一種指定的資料型別/訪問方法組合,可能會有多種運算子類,這樣就可以支援多種行為。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
opcamid | oid | pg_am.oid | 運算子類所服務的索引訪問方法 |
opcname | name | 這個運算子類的名字 | |
opcnamespace | oid | pg_namespace.oid | 這個運算子類的名字空間 |
opcowner | oid | pg_authid.oid | 運算子類屬主 |
opcintype | oid | pg_type.oid | 運算子類的輸入資料型別 |
opcdefault | bool | 如果運算子類是 opcintype 的預設,則為真 | |
opckeytype | oid | pg_type.oid | 索引資料的型別,如果和 opcintype 相同則為零 |
pg_operator
pg_operator 儲存有關運算子的資訊。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
oprname | name | 運算子的名字 | |
oprnamespace | oid | pg_namespace.oid | 包含此運算子的名字空間的 OID |
oprowner | oid | pg_authid.oid | 運算子所有者 |
oprkind | char | b = 中綴(“兩邊”), l = 字首(“左邊”), r = 字尾(“右邊”) | |
oprcanhash | bool | 這個運算子支援 Hash 連線 | |
oprleft | oid | pg_type.oid | 左運算元的型別 |
oprright | oid | pg_type.oid | 右運算元的型別 |
oprresult | oid | pg_type.oid | 結果型別 |
oprcom | oid | pg_operator.oid | 此運算子的交換符,如果存在的話 |
oprnegate | oid | pg_operator.oid | 此運算子的反轉器,如果存在的話 |
oprlsortop | oid | pg_operator.oid | 如果此運算子支援融合連線,這裡是對左運算元排序的運算子(L<L) |
oprrsortop | oid | pg_operator.oid | 如果此運算子支援融合連線,這裡是對右運算元排序的運算子(R<R) |
oprltcmpop | oid | pg_operator.oid | 如果這個運算子支援融合連線,那麼這是比較左右運算元型別(L<R)的小於運算子 |
oprgtcmpop | oid | pg_operator.oid | 如果這個運算子支援融合連線,那麼這是比較左右運算元型別(L>R)的大於運算子 |
oprcode | regproc | pg_proc.oid | 實現這個運算子的函式 |
oprrest | regproc | pg_proc.oid | 此運算子的約束選擇性計算函式 |
oprjoin | regproc | pg_proc.oid | 此運算子的連線選擇性計算函式 |
pg_pltemplate
pg_pltemplate 為過程語言儲存"模板"資訊。一個語言的模板允許該語言可以在某個資料庫裡使用簡單的 CREATE LANGUAGE 命令建立,而不需要宣告實現細節。
和許多系統表不一樣,pg_pltemplate 是在叢集裡的所有資料庫之間共享的:每個叢集只有一個 pg_pltemplate 的複製,而不是每個資料庫一個。這樣就允許這些資訊在需要時每個資料庫都可以訪問。
名字 | 型別 | 描述 |
---|---|---|
tmplname | name | 這個模板所應用的語言的名字 |
tmpltrusted | boolean | 如果語言被認為是可信的,則為真 |
tmplhandler | text | 呼叫處理器函式的名字 |
tmplvalidator | text | 校驗函式的名字,如果沒有則為 NULL |
tmpllibrary | text | 實現語言的共享庫的路徑 |
tmplacl | aclitem[] | 模板的訪問許可權(未使用) |
目前還沒有任何命令可以用於操作過程語言模板;要修改內建的資訊,超級使用者必須使用普通的 INSERT, DELETE, UPDATE 命令修改該表。將來版本的 PostgreSQL 有可能提供一些命令來修改這些內容,以便更清晰些。
在實現的時候,tmplacl 欄位將提供對模板自身的訪問控制(也就是使用它建立一個語言的許可權),而不是對那些從模板建立的語言的訪問控制。
pg_proc
pg_proc 表儲存關於函式(或過程)的資訊。該表包含聚集函式和普通函式的資料。如果 proisagg 為真,那麼在 pg_aggregate 裡應該有一個匹配行。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
proname | name | 函式名字 | |
pronamespace | oid | pg_namespace.oid | 包含該函式名字空間的 OID |
proowner | oid | pg_authid.oid | 函式的所有者 |
prolang | oid | pg_language.oid | 這個函式的實現語言或呼叫介面 |
proisagg | bool | 函式是聚集函式 | |
prosecdef | bool | 函式是一個安全定義器(也就是一個"setuid"函式) | |
proisstrict | bool | 如果任何呼叫引數是空,那麼函式返回空。這時函式實際上連呼叫都不呼叫。不是"strict"的函式必須準備處理空輸入。 | |
proretset | bool | 函式返回一個集合(也就是說,指定資料型別的多個數值) | |
provolatile | char | 告訴該函式的結果是否只倚賴於它的輸入引數,或者還會被外接因素影響。對於"不可變的"(immutable)函式它是 i ,這樣的函式對於相同的輸入總是產生相同的結果。對於"穩定的"(stable)函式它是 s ,(對於固定輸入)其結果在一次掃描裡不變。對於"易變"(volatile)函式它是 v ,其結果可能在任何時候變化。v 也用於那些有副作用的函式,因此呼叫它們無法得到最佳化。 | |
pronargs | int2 | 引數數目 | |
prorettype | oid | pg_type.oid | 返回值的資料型別 |
proargtypes | oidvector | pg_type.oid | 一個存放函式引數的資料型別的陣列。陣列裡只包括輸入引數(包括 INOUT 引數),因此代表該函式的呼叫簽名(介面)。 |
proallargtypes | oid[] | pg_type.oid | 一個包含函式引數的資料型別的陣列。陣列裡包括所有引數的型別(包括 OUT 和 INOUT 引數);不過,如果所有引數都是 IN 引數,那麼這個欄位就會是空。請注意陣列下標是以 1 為起點的,而因為歷史原因,proargtypes 的下標起點為 0 。 |
proargmodes | char[] | 一個儲存函式引數模式的陣列,編碼如下:i 表示 IN 引數, o 表示 OUT 引數, b 表示 INOUT 引數。如果所有引數都是 IN 引數,那麼這個欄位為空。請注意,下標對應的是 proallargtypes 的位置,而不是 proargtypes | |
proargnames | text[] | 一個儲存函式引數的名字的陣列。沒有名字的引數在陣列裡設定為空字串。如果沒有一個引數有名字,這個欄位將是空。請注意,此陣列的下標對應 proallargtypes 而不是 proargtypes | |
prosrc | text | 這個欄位告訴函式處理器如何呼叫該函式。它實際上對於解釋語言來說就是函式的源程式,或者一個連結符號,一個檔名,或者是任何其它的東西,具體取決於語言/呼叫習慣的實現。 | |
probin | bytea | 關於如何呼叫該函式的附加資訊。同樣,其含義也是和語言相關的。 | |
proacl | aclitem[] | 訪問許可權 |
pg_rewrite
pg_rewrite 儲存為表和檢視定義的重寫規則。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
rulename | name | 規則名稱 | |
ev_class | oid | pg_class.oid | 使用這條規則的表名稱 |
ev_attr | int2 | 這條規則適用的欄位(目前總是為零,表示整個表) | |
ev_type | char | 規則適用的事件型別: 1 = SELECT, 2 = UPDATE, 3 = INSERT, 4 = DELETE | |
is_instead | bool | 如果該規則是 INSTEAD 規則,那麼為真 | |
ev_qual | text | 規則的資格條件的表示式樹(以 nodeToString() 形式存在) | |
ev_action | text | 規則動作的查詢樹(以 nodeToString() 形式存在) |
**【注意】**如果一個表在這個系統表裡有任何規則存在,那麼 pg_class.relhasrules 必須為真。
pg_shdepend
pg_shdepend 記錄資料庫物件和共享物件(比如角色)之間的依賴性關係。這些資訊允許 PostgreSQL 保證在企圖刪除這些物件之前,這些物件是沒有被引用的。
pg_depend表的作用類似,只是它是用於在一個資料庫內部的物件的依賴性關係的。
和其它大多數系統表不同,pg_shdepend 是在叢集裡面所有的資料庫之間共享的:每個資料庫叢集只有一個 pg_shdepend ,而不是每個資料庫一個。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
dbid | oid | pg_database.oid | 依賴物件所在的資料庫的 OID ,如果是共享物件,則為零 |
classid | oid | pg_class.oid | 依賴物件所在的系統表的 OID |
objid | oid | 任意 oid 屬性 | 指定的依賴物件的 OID |
refclassid | oid | pg_class.oid | 被引用物件所在的系統表的 OID(必須是一個共享表) |
refobjid | oid | 任意 oid 屬性 | 指定的被引用物件的 OID |
deptype | char | 一段程式碼,定義了這個依賴性關係的特定語義 |
在任何情況下,一條 pg_shdepend 記錄就表面這個被引用的物件不能在未刪除依賴物件的前提下刪除。不過,deptype 同時還標出了幾種不同的子風格:
-
SHARED_DEPENDENCY_OWNER (o)
被引用的物件(必須是一個角色)是依賴物件的所有者。
-
SHARED_DEPENDENCY_ACL (a)
被引用的物件(必須是一個角色)在依賴物件的 ACL(訪問控制列表,也就是許可權列表)裡提到。SHARED_DEPENDENCY_ACL 不會在物件的所有者頭上新增的,因為所有者會有一個 SHARED_DEPENDENCY_OWNER 記錄。
-
SHARED_DEPENDENCY_PIN §
沒有依賴物件;這類記錄標識系統自身依賴於該被依賴物件,因此這樣的物件絕對不能被刪除。這種型別的記錄只是由 initdb 建立。這樣的依賴物件的欄位都是零。
其它依賴性的風格可能在將來會出現。請注意,目前的定義只是支援把角色當作被引用物件。
pg_shdescription
pg_shdescription 為共享資料庫物件儲存可選的註釋。
pg_description提供了類似的功能,它記錄了單個資料庫中物件的註釋。
不同於大多數系統表,pg_shdescription 是在叢集裡面所有的資料庫之間共享的:每個資料庫叢集只有一個 pg_shdescription ,而不是每個資料庫一個。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
objoid | oid | 任意 oid 屬性 | 這條描述所描述的物件的 OID |
classoid | oid | pg_class.oid | 這個物件出現的系統表的 OID |
description | text | 作為對該物件的描述的任意文字 |
pg_statistic
pg_statistic 表儲存有關該資料庫內容的統計資料。記錄是由 ANALYZE 建立的,並且隨後被查詢規劃器使用。請注意所有統計資訊天生都是近似的數值,即使假設它是最新的也如此。
pg_statistic 還儲存有關索引表示式數值的統計資料。這些是把他們當作實際的資料欄位來描述的;特別是,starelid 引用索引。不過,普通的非表示式欄位沒有記錄,因為會和下層的表欄位記錄冗餘。
因為不同型別的統計資訊適用於不同型別的資料,pg_statistic 被設計成不太在意自己儲存的是什麼型別的統計。只有極為常用的統計資訊(比如 NULL 的含量)才在 pg_statistic 裡給予專用的欄位。其它所有東西都儲存在"槽位"中,而槽位是一組相關的欄位,它們的內容用槽位中的一個欄位的程式碼號碼錶示。更詳細的資訊請參閱 src/include/catalog/pg_statistic.h
pg_statistic 不應該是公眾可讀的,因為即使是表內容的統計資訊也應該認為是敏感的。例子:薪水欄位的最大最小值肯定是相當讓人感興趣的。pg_stats是一個在 pg_statistic 上的全域性可讀的檢視,它只顯示那些表對於當前使用者可讀的資訊。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
starelid | oid | pg_class.oid | 所描述的欄位所屬的表或者索引 |
staattnum | int2 | pg_attribute.attnum | 所描述的欄位的個數 |
stanullfrac | float4 | 該欄位中為 NULL 的記錄的比率 | |
stawidth | int4 | 非 NULL 記錄的平均儲存寬度,以位元組計 | |
stadistinct | float4 | 欄位裡唯一的非 NULL 資料值的數目。一個大於零的數值是獨立數值的實際數目。一個小於零的數值是表中行數的分數的負數(比如,一個欄位的數值平均出現機率為兩次,那麼可以表示為 stadistinct = -0.5)。零值表示獨立數值的數目未知。 | |
stakindN | int2 | 一個編碼,表示這種型別的統計儲存在 pg_statistic 行的第 N 個"槽位"。 | |
staopN | oid | pg_operator.oid | 一個用於生成這些儲存在第 N 個"槽位"的統計資訊的運算子。比如,一個柱面圖槽位會顯示 < 運算子,該運算子定義了該資料的排序順序。 |
stanumbersN | float4[] | 第 N 個"槽位"的相關型別的數值型別統計,如果該槽位和數值型別沒有關係,那麼就是 NULL 。 | |
stavaluesN | anyarray | 第 N 個"槽位"相關型別的欄位資料值,如果該槽位型別不儲存任何資料值那麼就是 NULL 。每個陣列的元素值實際上都是指定欄位的資料型別,因此,除了把這些欄位的型別定義成 anyarray 之外,沒有更好的辦法。 |
pg_tablespace
pg_tablespace 儲存有關可用的表空間的資訊。表可以放置在特定的表空間裡,以幫助管理磁碟佈局。
與大多數系統表不同,pg_tablespace 在一個叢集中的所有資料庫之間共享:每個叢集只有一份 pg_tablespace 的複製,而不是每個資料庫一個。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
spcname | name | 表空間名字 | |
spcowner | oid | pg_authid.oid | 表空間的所有者,通常是建立它的人 |
spclocation | text | 表空間的位置(目錄路徑) | |
spcacl | aclitem[] | 訪問許可權 |
pg_trigger
pg_trigger 儲存表上面的觸發器。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
tgrelid | oid | pg_class.oid | 這個觸發器所在的表 |
tgname | name | 觸發器名稱(在同一表的所有觸發器中必須唯一) | |
tgfoid | oid | pg_proc.oid | 要呼叫的函式 |
tgtype | int2 | 標識觸發器條件的位掩碼 | |
tgenabled | bool | 如果觸發器開啟則為真 | |
tgisconstraint | bool | 如果觸發器實現一個參照完整性約束則為真 | |
tgconstrname | name | 參照完整性約束的名稱 | |
tgconstrrelid | oid | pg_class.oid | 一個參照完整性約束引用的表 |
tgdeferrable | bool | 如果可推遲則為真 | |
tginitdeferred | bool | 如果是初始可推遲則為真 | |
tgnargs | int2 | 傳遞給觸發器函式的引數字串個數 | |
tgattr | int2vector | 目前未使用 | |
tgargs | bytea | 傳遞給觸發器的引數字串,每個都是用 NULL 結尾 |
【注意】 pg_class.reltriggers 需要和此表中指定關係上得觸發器的個數相等。
pg_type
pg_type 儲存有關資料型別的資訊。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
typname | name | 資料型別名字 | |
typnamespace | oid | pg_namespace.oid | 包含這個型別的名字空間的 OID |
typowner | oid | pg_authid.oid | 該型別的所有者 |
typlen | int2 | 對於定長型別是該型別內部表現形式的位元組數目。對於變長型別是負數。-1 表示一種"變長"型別(有長度字屬性的資料),-2 表示這是一個 NULL 結尾的 C 字串。 | |
typbyval | bool | 判斷內部過程傳遞這個型別的數值時是透過傳值還是傳引用。如果該型別不是 1, 2, 4, 8 位元組長將只能按應用傳遞,因此 typbyval 最好是假。即使可以傳值,typbyval 也可以為假。比如 float4 就是如此。 | |
typtype | char | 對於基礎型別是 b ,對於複合型別是 c (比如,一個表的行型別)。對於域型別是 d ,對於偽型別是 p 。又見 typrelid 和 typbasetype | |
typisdefined | bool | 如果定義了型別則為真,如果是一種尚未定義的型別的佔位符則為假。如果為假,那麼除了該型別名稱,名字空間,和 OID 之外沒有可靠的資訊。 | |
typdelim | char | 當分析陣列輸入時,分隔兩個此型別數值的字元請注意該分隔符是與陣列元素資料型別相關聯的,而不是和陣列資料型別關聯。 | |
typrelid | oid | pg_class.oid | 如果是複合型別(見 typtype)那麼這個欄位指向 pg_class 中定義該表的行。對於自由存在的複合型別,pg_class 記錄並不表示一個表,但是總需要它來查詢該型別連線的 pg_attribute 記錄。對於非複合型別為零。 |
typelem | oid | pg_type.oid | 如果不為 0 ,那麼它標識 pg_type 裡面的另外一行。當前型別可以當做一個產生型別為 typelem 的陣列來描述。一個"真正的"陣列型別是變長的(typlen = -1),但是一些定長的(typlen > 0)型別也擁有非零的 typelem(比如 name 和 point)。如果一個定長型別擁有一個 typelem ,那麼他的內部形式必須是 typelem 資料型別的某個數目的個數值,不能有其它資料。變長陣列型別有一個該陣列子過程定義的頭(檔案)。 |
typinput | regproc | pg_proc.oid | 輸入轉換函式(文字格式) |
typoutput | regproc | pg_proc.oid | 輸出轉換函式(文字格式) |
typreceive | regproc | pg_proc.oid | 輸入轉換函式(二進位制格式),如果沒有則為 0 |
typsend | regproc | pg_proc.oid | 輸出轉換函式(二進位制格式),如果沒有則為 0 |
typanalyze | regproc | pg_proc.oid | 自定義的 ANALYZE 函式,如果使用標準函式,則為 0 |
typalign | char | 當儲存此型別的數值時要求的對齊性質。它應用於磁碟儲存以及該值在 PostgreSQL 內部的大多數形式。如果數值是連續存放的,比如在磁碟上以完全的裸資料的形式存放時,那麼先在此型別的資料前填充空白,這樣它就可以按照要求的界限儲存。對齊引用是該序列中第一個資料的開頭。可能的值有:c = char 對齊,也就是不需要對齊。s = short 對齊(在大多數機器上是 2 位元組)i = int 對齊(在大多數機器上是 4 位元組)d = double 對齊(在大多數機器上是 8 位元組,但不一定是全部)**【注意】**對於在系統表裡使用的型別,在 pg_type 裡定義的尺寸和對齊必須和編譯器在一個表示表的一行的結構裡的佈局一樣。 | |
typstorage | char | 訴一個變長型別(那些有 typlen = -1)的)說該型別是否準備好應付非常規值,以及對這種屬性的型別的預設策略是什麼。可能的值有p: 數值總是以簡單方式儲存e: 數值可以儲存在一個"次要"關係中(如果該關係有這麼一個,參閱 pg_class.reltoastrelid)m: 數值可以以內聯的壓縮方式儲存x: 數值可以以內聯的壓縮方式或者在"次要"表裡儲存。請注意 m 域也可以移到從屬表裡儲存,但只是最後的解決方法(e 和 x 域先移走)。 | |
typnotnull | bool | 代表在某型別上的一個 NOTNULL 約束。目前只用於域。 | |
typbasetype | oid | pg_type.oid | 如果這是一個衍生型別(參閱 typtype),那麼該標識作為這個型別的基礎的型別。如果不是衍生型別則為零。 |
typtypmod | int4 | 域使用 typtypmod 記錄要作用到它們的基礎型別上的 typmod (如果基礎型別不使用 typmod 則為 -1)。如果這種型別不是域,那麼為 -1 。 | |
typndims | int4 | 如果一個域是陣列,那麼 typndims 是陣列維數的數值(也就是說,typbasetype 是一個陣列型別;域的 typelem 將匹配基本型別的 typelem)。非域非陣列域為零。 | |
typdefaultbin | text | 如果為非 NULL ,那麼它是該型別預設表示式的 nodeToString() 表現形式。目前這個欄位只用於域。 | |
typdefault | text | 如果某型別沒有相關預設值,那麼 typdefault 是 NULL 。如果 typdefaultbin 不是 NULL ,那麼 typdefault 必須包含一個 typdefaultbin 代表的預設表示式的人類可讀的版本。如果 typdefaultbin 為 NULL 但 typdefault 不是,那麼 typdefault 是該型別預設值的外部表現形式,可以把它交給該型別的輸入轉換器生成一個常量。 |
Postgresql系統檢視
概述
除了系統表之外,PostgreSQL 還提供了一系列內建的檢視。系統檢視提供了查詢系統表的一些便利的訪問方法。其它一些檢視提供了訪問內部伺服器狀態的方法。
資訊模式提供了另外一套檢視,它的功能覆蓋了系統檢視的功能。因為資訊模式是 SQL 標準,而這裡描述的檢視是 PostgreSQL 特有的,所以最好用資訊模式來獲取自己需要的所有資訊。
下面是每個檢視更詳細的資訊。有些檢視提供了對統計收集器的結果的訪問。
除了特別宣告的,這裡描述的所有檢視都是隻讀的。
檢視名 | 用途 |
---|---|
pg_cursors | 開啟的遊標 |
pg_group | 資料庫使用者的組 |
pg_indexes | 索引 |
pg_locks | 當前持有的鎖 |
pg_prepared_statements | 預備語句 |
pg_prepared_xacts | 預備事務 |
pg_roles | 資料庫角色 |
pg_rules | 規則 |
pg_settings | 引數設定 |
pg_shadow | 資料庫使用者 |
pg_stats | 規劃器統計 |
pg_tables | 表 |
pg_timezone_abbrevs | 時區縮寫 |
pg_timezone_names | 時區名 |
pg_user | 資料庫使用者 |
pg_views | 檢視 |
pg_cursors
pg_cursors 列出了當前可用的遊標。遊標可以用幾種不同的方法定義:
- 透過 DECLARE語句
- 在前/後端協議中透過 Bind 資訊。
- 透過伺服器程式設計介面(SPI)。
pg_cursors 顯示上述所有方法建立的遊標。除非被宣告為 WITH HOLD ,遊標僅存在於定義它們的事務的生命期中。因此非持久遊標僅能夠在檢視中存在到建立該遊標的事務結束時為止。
pg_cursors 檢視是隻讀的。
**【注意】**因為遊標用於在 PostgreSQL 內部實現一些比如過程語言之類的元件。因此 pg_cursors 可能包含並非由使用者明確建立的遊標。
名字 | 型別 | 描述 |
---|---|---|
name | text | 遊標名 |
statement | text | 宣告該遊標的查詢字串 |
is_holdable | boolean | 如果該遊標是持久的(也就是在宣告該遊標的事務結束後仍然可以訪問該遊標)則為 true ;否則為 false |
is_binary | boolean | 如果該遊標被宣告為 BINARY 則為 true ;否則為 false |
is_scrollable | boolean | 如果該遊標可以滾動(也就是允許以不連續的方式檢索)則為 true ;否則為 false |
creation_time | timestamptz | 宣告該遊標的時間戳 |
pg_group
pg_group 的存在是為了向下相容:它模擬一個存在於 PostgreSQL 版本 8.1 之前的系統表。它顯示所有標記為不是 rolcanlogin 的角色的名字和成員,這就是近似於用做組的那些角色的集合了。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
groname | name | pg_authid.rolname | 組的名字 |
grosysid | oid | pg_authid.oid | 組的 ID |
grolist | oid[] | pg_authid.oid | 一個陣列,包含這個組裡面所有角色的 ID |
pg_indexes
pg_indexes 提供對資料庫中每個索引的有用資訊的訪問。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
schemaname | name | pg_namespace.nspname | 包含表和索引的模式的名字 |
tablename | name | pg_class.relname | 此索引所服務的表的名字 |
indexname | name | pg_class.relname | 索引的名字 |
tablespace | name | pg_tablespace.spcname | 包含索引的表空間名字(如果是資料庫預設,則為 NULL) |
indexdef | text | 索引定義(一個重建的 CREATE INDEX 命令) |
pg_locks
pg_locks 提供有關在資料庫伺服器中由開啟的事務持有的鎖的資訊。
pg_locks 對每個活躍的可鎖定物件、請求的鎖模式、以及相關的事務儲存一行。因此,如果多個事務持有或者等待對同一個物件的鎖,那麼同一個可鎖定的物件可能出現多次。不過,一個目前沒有鎖在其上的物件將肯定不會出現。
有好幾種不同的可鎖定物件:一個關係(也就是一個表)、關係中獨立頁面、關係中獨立的行、一個事務 ID 、以及一般的資料庫物件(用類別 OID 和物件 OID 標識,表示方法和 pg_description 或 pg_depend一樣)還有,擴充套件一個關係的許可權也是用一種獨立的可鎖定物件表示的。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
locktype | text | 可鎖定物件的型別:relation, extend, page, tuple, transactionid, object, userlock, advisory 之一 | |
database | oid | pg_database.oid | 物件所在的資料庫的 OID ,如果物件是共享物件,那麼就是零,如果物件是一個事務 ID ,就是 NULL 。 |
relation | oid | pg_class.oid | 關係的 OID ,如果物件不是關係,也不是關係的一部分,則為 NULL |
page | integer | 關係內部的頁面編號,如果物件不是行頁不是關係頁,則為 NULL | |
tuple | smallint | 頁面裡面的行編號,如果物件不是行,則為 NULL | |
transactionid | xid | 事務的 ID ,如果物件不是事務 ID ,就是 NULL | |
classid | oid | pg_class.oid | 包含該物件的系統表的 OID ,如果物件不是普通資料庫物件,則為 NULL |
objid | oid | 任意 oid 屬性 | 物件在其系統表內的 OID ,如果物件不是普通資料庫物件,則為 NULL |
objsubid | smallint | 對於表的一個欄位,這是欄位編號(classid 和 objid 指向表自身)。對於其它物件型別,這個欄位是零。如果這個物件不是普通資料庫物件,則為 NULL | |
transaction | xid | 持有此鎖或者在等待此鎖的事務的 ID | |
pid | integer | 持有或者等待這個鎖的伺服器程序的程序 ID 。如果鎖是被一個預備事務持有的,那麼為 NULL | |
mode | text | 這個程序持有的或者是期望的鎖模式 | |
granted | boolean | 如果持有鎖,為真,如果等待鎖,為假 |
granted 為真時表明指定事務持有一個鎖。為假則表明該事務當前等待使用這個鎖,這就暗示著某個其它的事務正在同樣的可鎖定物件上持有衝突的鎖模式。等待的會話將一直睡眠,直到另外一個鎖釋放(或者偵測到一個死鎖條件)。一個事務一次最多等待一個鎖。
每個事務都在它持續的時間裡在他自己的事務 ID 上持有一個排他鎖。如果一個事務認為它必須等待另外一個事務,它會以企圖在另外一個事務 ID 上獲取共享鎖的方式實現之。這個鎖只有在另外一個事務終止並且釋放它的鎖的前提下才能成功。
儘管行是一種可以鎖定的物件,但是有關行級別鎖的資訊是儲存在磁碟上的,而不是在記憶體裡,因此,行級別的鎖通常不會出現在這個檢視裡。如果一個事務在等待一個行級別的鎖,那麼它通常會在這個檢視裡以等待當前持有該行鎖的事務 ID 的方式出現。
建議鎖可以在由單獨一個 bigint 值或兩個integer值組成的鍵上獲得。一個 bigint 鍵的高/低位部分分別在 classid 和 objid 欄位中顯示,並且 objsubid 等於 1 。integer 組成的鍵前半部分在 classid 欄位中顯示、後半部分在 objid 欄位中顯示,並且 objsubid 等於 2 。鍵的實際含義取決於使用者的定義。建議鎖是針對單個資料庫的,因此 database 欄位對於建議鎖就顯得很有意義了。
在訪問 pg_locks 檢視的時候,內部的鎖管理器資料結構會暫時被鎖住,然後製作一份這個檢視的複製用於顯示。這樣就保證了檢視生成一套連貫的結果,它不會不必要地過分阻塞普通的鎖管理器。但是如果這個檢視訪問得太頻繁,肯定是會對資料庫效能有些影響的。
pg_locks 提供了一個資料庫叢集裡的所有的鎖的全域性檢視,而不僅僅那些和當前資料庫相關的。儘管它的 relation 欄位可以和 pg_class.oid 連線起來以標識被鎖住的關係,但是這個方法目前只能對在當前資料庫裡的關係有用(那些 database 欄位是當前資料庫的 OID 或者零的資料庫)。
如果你開啟了統計收集器,pid 欄位可以可以和 pg_stat_activity 檢視的 procpid 欄位連線起來獲取持有或者等待持有這個鎖的會話的更多資訊。同樣,如果你使用預備事務,可以把 transaction 欄位和 pg_prepared_xacts 檢視的 transaction 欄位連線起來獲取持有鎖的那個預備事務的更多資訊。一個預備事務不能等待任何鎖,但是在執行的時候,它繼續持有它已經請求到的鎖。
pg_prepared_statements
pg_prepared_statements 顯示所有當前會話中可用的預備語句。
pg_prepared_statements 檢視是隻讀的。
每個預備語句在 pg_prepared_statements 中都有對應的一條記錄。當一條新的預備語句建立後該檢視中就會新增一條記錄,同樣,當一條預備語句被釋放後(比如透過 DEALLOCATE命令),相應的記錄也會被刪除。
名字 | 型別 | 描述 |
---|---|---|
name | text | 預備語句的識別符號 |
statement | text | 建立該預備語句的查詢字串。對於從 SQL 建立的預備語句而言是客戶端提交的 PREPARE 語句。對於透過前/後端協議建立的預備語句而言是預備語句自身的文字。 |
prepare_time | timestamptz | 建立該預備語句的時間戳 |
parameter_types | regtype[] | 該預備語句期望的引數型別,以 regtype 型別的陣列格式出現。與該陣列元素相對應的 OID 可以透過把 regtype 值轉換為 oid 值得到。 |
from_sql | boolean | 如果該預備語句是透過 PREPARE 語句建立的則為 true ;如果是透過前/後端協議建立的則為 false |
pg_prepared_xacts
pg_prepared_xacts 顯示那些當前準備好進行兩階段提交的事務的資訊。
pg_prepared_xacts 為每個預備事務包含一行。如果事務提交或者回滾,則刪除該條記錄。
在訪問 pg_prepared_xacts 檢視的時候,內部事務管理器資料結構被暫時鎖住,並且為顯示檢視製作了一份複製。這樣就保證了檢視生成一個一致的結果集,而不會阻塞正常的操作太長時間。當然,即便這麼做,如果過於頻繁地訪問這個檢視,肯定也會對資料庫效能造成一定的影響。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
transaction | xid | 預備事務的數字事務標識 | |
gid | text | 賦予該事務的全域性事務標識 | |
prepared | timestamp with time zone | 事務準備好提交的時間 | |
owner | name | pg_authid.rolname | 執行該事務的使用者的名字 |
database | name | pg_database.datname | 執行該事務所在的資料庫名 |
pg_roles
pg_roles 提供訪問資料庫角色有關資訊的介面。它只是一個 pg_authid表的公開可讀部分的檢視,把口令欄位用空白填充了。
該檢視明確的顯示了底層表的 OID 欄位,可以用於與其它表連線。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
rolname | name | 角色名 | |
rolsuper | bool | 有超級使用者許可權的角色 | |
rolinherit | bool | 自動繼承屬主角色許可權的角色 | |
rolcreaterole | bool | 可以建立更多角色的角色 | |
rolcreatedb | bool | 可以建立資料庫的角色 | |
rolcatupdate | bool | 可以直接更新系統表的角色。除非這個欄位為真,否則超級使用者也不能幹這個事情。 | |
rolcanlogin | bool | 可以登入的角色,也就是說,這個角色可以給予初始化會話認證的識別符號。 | |
rolconnlimit | int4 | 對於可以登入的角色,這兒限制了該角色允許發起的最大併發連線數。 -1 表示無限制。 | |
rolpassword | text | 不是口令(總是 ********) | |
rolvaliduntil | timestamptz | 口令失效日期(只用於口令認證);如果沒有失效期,為 NULL | |
rolconfig | text[] | 執行時配置變數的會話預設 | |
oid | oid | pg_authid.oid | 角色的 ID |
pg_rules
pg_rules 提供對查詢重寫規則的有用資訊訪問的介面。
pg_rules 檢視排除了檢視的 ON SELECT 規則;就是那些可以在 pg_views 裡看到的。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
schemaname | name | pg_namespace.nspname | 包含表的模式的名字 |
tablename | name | pg_class.relname | 規則作用的表的名字 |
rulename | name | pg_rewrite.rulename | 規則的名字 |
definition | text | 規則定義(一個重新構造的建立命令) |
pg_settings
pg_settings 提供了對伺服器執行時引數的訪問。它實際上是 SHOW 和 SET 命令的另外一個介面。它還提供一些用 SHOW 不能直接獲取的引數的訪問,比如最大和最小值。
名字 | 型別 | 描述 | |
---|---|---|---|
name | text | 執行時配置引數名 | |
setting | text | 引數的當前值 | |
unit | text | 引數的隱含單元 | |
category | text | 引數的邏輯組 | |
short_desc | text | 引數的一個簡短的描述 | |
extra_desc | text | 有關引數的額外的,更詳細的資訊 | |
context | text | 設定這個引數的值要求的環境 | |
vartype | text | 引數型別(bool, integer, real, string) | |
source | text | 當前引數值的來源 | |
min_val | text | 該引數允許的最小值(非數字值為 NULL) | |
max_val | text | 這個引數允許的最大的數值(非數字值為 NULL) |
不能對 pg_settings 檢視進行插入或者刪除,但是可以更新。對 pg_settings 中的一行進行 UPDATE 等效於在該命名引數上執行 SET命令。這個修改值影響當前會話使用的數值。如果在一個最後退出的事務中發出了 UPDATE 命令,那麼 UPDATE 命令的效果將在事務回滾之後消失。一旦包圍它的事務提交,這個效果將固化,直到會話結束,除非由其它的 UPDATE 或 SET 命令覆蓋。
pg_shadow
pg_shadow 存在是為了向下相容:它模擬了一個 PostgreSQL 版本 8.1 之前的系統表。它顯示了所有標記了 rolcanlogin 的角色的屬性。
這個系統表的名字來自於該表不能被公眾可讀,因為它包含口令。pg_user是一個在 pg_shadow 上公開可讀的檢視,只是把口令域填成了空白。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
usename | name | pg_authid.rolname | 使用者名稱 |
usesysid | oid | pg_authid.oid | 使用者的 ID |
usecreatedb | bool | 使用者可以建立資料庫 | |
usesuper | bool | 使用者是超級使用者 | |
usecatupd | bool | 使用者可以更新系統表。即使超級使用者,如果這個欄位不是真,也不能更新系統表。 | |
passwd | text | 口令(可能是加密的) | |
valuntil | abstime | 口令失效的時間(只用於口令認證) | |
useconfig | text[] | 執行時配置變數的會話預設 |
pg_stats
pg_stats 提供對儲存在 pg_statistic表裡面的資訊的訪問。這個檢視允許只訪問那些在 pg_statistic 裡面對應使用者有許可權讀取的表的資料行,因此可以安全地允許公眾訪問這個檢視。
pg_stats 也設計成把資訊以一種更易讀的方式出現的形式,它比下層的系統表更容易閱讀,代價就是如果在 pg_statistic 裡定義了新的資料槽位,那麼必須擴充套件它的檢視定義。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
schemaname | name | pg_namespace.nspname | 包含此表的模式名字 |
tablename | name | pg_class.relname | 表的名字 |
attname | name | pg_attribute.attname | 這一行描述的欄位的名字 |
null_frac | real | 記錄中欄位為空的百分比 | |
avg_width | integer | 欄位記錄以位元組記的平均寬度 | |
n_distinct | real | 如果大於零,就是在欄位中獨立數值的估計數目。如果小於零,就是獨立數值的數目被行數除的負數。用負數形式是因為 ANALYZE 認為獨立數值的數目是隨著表增長而增長;正數的形式用於在欄位看上去好像有固定的可能值數目的情況下。比如,-1 表示一個唯一欄位,獨立數值的個數和行數相同。 | |
most_common_vals | anyarray | 一個欄位裡最常用數值的列表。如果看上去沒有啥數值比其它更常見,則為 NULL | |
most_common_freqs | real[] | 一個最常用數值的頻率的列表,也就是說,每個出現的次數除以行數。如果 most_common_vals 是 NULL ,則為 NULL | |
histogram_bounds | anyarray | 一個數值的列表,它把欄位的數值分成幾組大致相同熱門的組。如果在 most_common_vals 裡有數值,則在這個餅圖的計算中省略。如果欄位資料型別沒有 < 運算子或者 most_common_vals 列表代表了整個分佈性,則這個欄位為 NULL 。 | |
correlation | real | 統計與欄位值的物理行序和邏輯行序有關。它的範圍從 -1 到 +1 。在數值接近 -1 或者 +1 的時候,在欄位上的索引掃描將被認為比它接近零的時候開銷更少,因為減少了對磁碟的隨機訪問。如果欄位資料型別沒有 < 運算子,那麼這個欄位為 NULL 。 |
在 most_common_vals 和 histogram_bounds 陣列裡的元素的最大數目可以用 ALTER TABLE SET STATISTICS 命令一個一個欄位地設定,或者透過設定執行時引數 default_statistics_target全域性地設定。
pg_tables
pg_tables 提供了對有關資料庫中每個表的有用資訊地訪問。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
schemaname | name | pg_namespace.nspname | 包含表的模式名字 |
tablename | name | pg_class.relname | 表的名字 |
tableowner | name | pg_authid.rolname | 表的所有者的名字 |
tablespace | name | pg_tablespace.spcname | 包含表的表空間名字(如果是資料庫預設,則為 NULL) |
hasindexes | boolean | pg_class.relhasindex | 如果表擁有(或者最近擁有)任何索引,則為真 |
hasrules | boolean | pg_class.relhasrules | 如果表有規則,則為真 |
hastriggers | boolean | pg_class.reltriggers | 如果表有觸發器,則為真 |
pg_timezone_abbrevs
pg_timezone_abbrevs 提供了輸入例程能夠識別的所有時區縮寫。當執行時引數 timezone_abbreviations發生改變的時候,該檢視的內容也會發生改變。
名字 | 型別 | 描述 |
---|---|---|
abbrev | text | 時區縮寫 |
utc_offset | interval | 相對於 UTC 的偏移量 |
is_dst | boolean | 如果這是一個夏時制時區縮寫則為真 |
pg_timezone_names
pg_timezone_names 顯示了所有能夠被 SET TIMEZONE 識別的時區名及其縮寫、UTC 偏移量、是否夏時制。不同於在 pg_timezone_abbrevs中顯示的縮寫,許多這些名字都隱含著夏令時轉換規則。因此,在跨越夏令時邊界時香瓜資訊會發生變化。顯示的資訊給予當前的 CURRENT_TIMESTAMP 值進行計算。
名字 | 型別 | 描述 |
---|---|---|
name | text | 時區名 |
abbrev | text | 時區縮寫 |
utc_offset | interval | 相對於 UTC 的偏移量 |
is_dst | boolean | 如果當前正處於夏令時範圍則為真 |
pg_user
pg_user 提供了對資料庫使用者的相關資訊的訪問。這個檢視只是一個 pg_shadow的公眾可讀的部分的檢視化,它把口令域給刷掉了。
名字 | 型別 | 描述 |
---|---|---|
usename | name | 使用者名稱 |
usesysid | int4 | 使用者 ID(用於引用這個使用者的任意數字) |
usecreatedb | bool | 使用者可以建立資料庫 |
usesuper | bool | 使用者是一個超級使用者 |
usecatupd | bool | 使用者可以更新系統表。即使超級使用者也不能這麼幹,除非這個欄位為真。 |
passwd | text | 不是口令(總是為 ********) |
valuntil | abstime | 口令失效的時間(只用於口令認證) |
useconfig | text[] | 執行時配置引數的會話預設 |
pg_views
pg_views 提供了對資料庫裡每個檢視的有用資訊的訪問途徑。
名字 | 型別 | 引用 | 描述 |
---|---|---|---|
schemaname | name | pg_namespace.nspname | 包含此檢視的模式名字 |
viewname | name | pg_class.relname | 檢視的名字 |
viewowner | name | pg_authid.rolname | 檢視的所有者的名字 |
definition | text | 檢視定義(一個重建的 SELECT 查詢) |