讀書筆記-PostgreSQL數據庫內核分析 系統表

在關係數據庫中,爲了實現數據庫系統的控制,必須提供數據字典的功能。數據字典不僅存儲各種對象的描述信息,而且存儲系統管理所需的各種對象的細節信息。從內容來看,數據字典包含:

  1. 數據庫系統中所有對象及其屬性的描述信息
  2. 對象之間關係的描述信息
  3. 對象屬性的自然語言含義
  4. 數據字典變化的歷史(即數據庫的狀態信息)

數據字典是關係數據庫系統管理控制信息的核心,在PostgreSQL數據庫系統中,系統表扮演着數據字典的角色。系統表是PostgreSQL數據庫存放結構元數據的地方,它在PostgreSQL中表現爲存放有系統信息的普通表或者視圖。用戶可以刪除然後重建這些表、增加列、插入和更新數值,然後由用戶去修改系統會導致系統信息的不一致性,進而導致系統控制紊亂。正常情況下不應該由用戶手工修改系統表,而是由SQL命令關聯的系統表操作自動維護系統表信息。比如,創建數據庫語句會向pg_database系統表插入一行,並且在磁盤上創建該數據庫。
PostgreSQL的每一個數據庫中都有自己的一套系統表,其中大多數系統表都是在數據庫創建時從模板數據庫中拷貝過來的,因此這些系統表裏的數據都是與所屬數據庫相關的。只有少數系統表是所有數據庫共享的(比如pg_database),這些系統表裏的數據是關於所有數據庫的。
由於系統表保存了數據庫的所有元數據,所有系統運行時對系統表的訪問是非常頻繁的。爲了提高系統性能,在內存中建立共享的系統表CACHE,使用Hash函數和Hash表提高查詢效率
系統表功能的實現代碼包含系統表定義文件和系統表綁定函數實現文件。分別位於如下位置:
在src/include/catalog目錄下有若干以’pg_xxx’開頭的.h文件,它們相應地定義了名爲pg_xxx的系統表的數據結構,其中的Indexing.h文件定義了所有的系統表索引,toasting.h文件定義了所有系統表的TOAST表(TOAST表用於存放普通表中超長屬性值)
在src/backend.catalog目錄下的pg_xxx.c文件中定義了對pg_xxx進行相關操作的函數,其中的indexing.c文件定義了四個操作系統表索引的函數,toasting.c文件定義了四個操作系統表的TOAST表的函數。

主要系統表功能及依賴關係

在PostgreSQL 8.4.1中,共有42張系統表和17張系統視圖,系統視圖是建立在基本系統表之上的。

系統表

在這裏插入圖片描述
pg_namespace
系統表pg_namespace用於存儲命名空間。命名空間是SQL92模式下層的結構:每個名字空間有獨立的關係、類型等集合,但並不會相互衝突。PostgreSQL的名字空間層次是:數據庫、模式、表、屬性。當要訪問一個對象時,PostgreSQL會按一下名字空間順序進行搜索:特殊名字空間(special),僅用於創建模式->臨時表的名字空間(TEMP)->系統表的名字空間。
pg_namespace中每個元組都對應一個名字空間,每個名字空間都被分配一個OID(對象標識符,用於在整個數據庫系統中唯一地標識一個數據庫對象,包括數據庫、表、視圖、索引等)作爲唯一標識,並且存儲在對應元組的隱藏屬性(PostgreSQL中每個元組都有幾個用戶不可見的屬性,用於記錄一些系統級的信息)中。
在這裏插入圖片描述
pg_tablespace
pg_tablespace存儲表空間信息,將表放置在不同的表空間有助於實施磁盤文件佈局。pg_tablespace在整個數據集簇裏只有一份,也就是說同一個數據集簇內的所用數據庫共享一個pg_tablespace表。PostgreSQL裏的表空間允許數據庫管理員在文件系統裏定義代表數據庫對象的文件的存放位置。通過使用表空間,管理員可以控制一個PostgreSQL中數據的磁盤佈局,即可以通過表空間將PostgreSQL系統的數據分佈在不同的磁盤位置上。

  • 如果初始的集簇所在的分區或者卷用光了空間,而又無法擴展該分區或卷的空間,那麼可以通過表空間去利用另一個分區的空間
  • 表空間允許管理員根據數據庫對象的使用模式安排數據位置,從而優化性能。比如一個使用很頻繁的索引可以放在非常快並且可靠的磁盤上,而一個存儲歸檔的數據、很少使用的或者對性能要求不高的表可以存儲在一個相對便宜但速度比較慢的磁盤系統上。
    pg_tablespace中每一個元組都對應一個表空間,每一個表空間都被分配一個OID作爲唯一標識,並且存儲在對應元祖的隱藏屬性中。
    在這裏插入圖片描述

pg_database
pg_database中存放了當前數據集簇中數據庫的信息,它是一個在整個集簇範圍內共享的系統表。該表中每個元祖就標識集簇中的一個數據庫,每一個數據庫都被分配一個OID作爲唯一標識,並且存儲在對應元祖的隱藏屬性中。
在這裏插入圖片描述
pg_class
pg_class存儲表及與表類似結構的數據庫對象信息,包括索引、序列、視圖、複合物數據類型、TOAST表等。每一個對象都在pg_class中表示爲一個元祖,並且每一個對象都會被分配一個OID作爲唯一標識,該OID作爲該元祖的一個隱藏屬性存儲。
在這裏插入圖片描述
在這裏插入圖片描述
pg_type
pg_type存儲數據類型信息。基本數據類型和枚舉類型由CREATE TYPE創建,域類型由CREATE DOMAIN創建,複合數據類型在表創建時自動創建。pg_type中每一個元祖對應一個數據類型。
在這裏插入圖片描述
在這裏插入圖片描述
pg_attribute
pg_attribute存儲表的屬性信息,對於數據庫中標的每一個屬性都有一個元祖。
在這裏插入圖片描述
在這裏插入圖片描述
pg_index
pg_index存儲索引的具體信息
在這裏插入圖片描述

系統視圖

系統視圖是在初始化數據庫集簇的時候讀取腳本創建的。系統視圖提供了查詢系統表和訪問數據庫內部狀態的方法。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章