PostgreSQL系統概述_PG數據庫內核分析學習筆記

PostgreSQL系統概述_PG數據庫內核分析學習筆記

PG簡介和發展歷程

PG以一種先進的對象-關係數據庫管理系統(ORDBMS), 它不僅支持關係數據庫的各種功能, 而且還具備類, 繼承等對象數據庫的特徵.
它是目前功能最強大, 特性最豐富的和結構最複雜的開源數據庫管理系統, 其中有些特性甚至連商業數據庫都不具備.

什麼是對象數據庫?

面向對象數據庫系統(OODBS)支持定義和操作OODB,應滿足兩個標準:首先它是數據庫系統,其次它也是面向對象系統。第一個標準即作爲數據庫系統應具備的能力(持久性、事務管理、併發控制、恢復、查詢、版本管理、完整性、安全性)。第二個標準就是要求面向對象數據庫充分支持完整的面向對象(OO)概念和控制機制。

面向對象數據庫和關係數據庫的區別?

以關係數據庫爲例,SQL語言是一種非過程化的面向集合的語言,它雖然用起來非常簡單,但由於是解釋實現,效率不如人意。因此許多應用仍然是由高級程序設計語言(如C)來實現的,但是高級程序設計語言是過程化的,而且是面向單個數據的,這使得SQL與它之間存在着不匹配,我們把它叫做“阻抗失配”。不論你是用嵌入式SQL,還是CLI,都需要化很多工夫去完成兩種語言之間的相互轉化。 但是關係數據庫在數據庫系統方面發展地非常完善,有強大的管理功能和可操縱性。另外,關係模型具有堅實的數學基礎。
面向對象數據庫的產生主要是爲了解決“阻抗失配”,它強調高級程序設計語言與數據庫的無縫連接。什麼叫無縫連接,假設你 不用數據庫,用C語言編了一個程序,你可以不需要(或基本不需要)任何改動就將它作用於數據庫,即你可以用C語言透明訪問數據庫,就好象數據庫根本不存在一樣,所以也有人把面向對象數據庫理解爲語言的持久化。怎麼樣,聽起來挺玄的吧,可是我們自己開發的數據庫系統——OSCAR早就做到了這一點。 由於實現了無縫連接,使得面向對象數據庫能夠支持非常複雜的數據模型,從而特別適用於工程設計領域。打個比方,想象CAD中的一個複雜部件,它可能由成千上萬個不同的零件組成,要是用關係模型中的表來表達,得用多少張表啊?而描述這種複雜的部件,正好是高級程序設計語言的強項。
此外,面向對象數據庫還吸收了面向對象程序設計語言的思想,如支持類、方法、繼承等概念。 面向對象數據庫很好地解決了阻抗失配的問題,但它也有缺點。它的缺點正好是關係數據庫的強項,由於模型較爲複雜(而且缺乏數學基礎),使得很多系統管理功能難以實現(如權限管理),也不具備SQL處理集合數據的強大能力。
另一方面,隨着多媒體數據的大量出現和應用的日益複雜,關係數據庫也在不斷吸收面向對象數據庫的優點,出現了現在所謂的對象關係型數據庫(象ORACLE8i、DB2-5以上都是這種系統)。其主要改進包括支持自定義類型(UDT),方法,繼承(目前僅DB2-6支持),和引用(使得對象間可以直接引用,想想原來的關係數據庫需要靠連接來實現引用,性能真是慘不忍睹)。 總之,數據庫系統發展的趨勢是,面向對象數據庫和關係數據庫將不斷融合。而對象關係數據庫由於繼承了上述兩者的優點,已經成爲目前數據庫發展的主流。

Oracle和MySQL、PostgreSQL特性對比

Oracle與PostGreSQL的差異對比

PostgreSQL與MySQL比較

PostgreSQL簡介及發展歷程

PG的特性

PG是一種幾乎可以運行在各種平臺上的免費的開放源碼的對象關係數據庫管理系統, 擁有與企業級數據庫相媲美的特性, 如完善的SQL標準支持, 多版本併發控制(MVCC), 時間點恢復(PITR), 表空間機制, 異步複製, 嵌套事務, 在線(online)/熱備份, 一個複雜的查詢優化器, 預寫式(WAL)日誌容錯技術.
PG在管理大數據量方面有良好的可擴展性, 對併發用戶管理具有自適應性.
現在已經出現具有管理超過4萬億字節數據能力的使用版本產品.

PG的應用

  1. Sony在線娛樂網站

Sony在線娛樂網站(SOE)經營着很多知名遊戲, 因此其數據庫需要快速處理大量的用戶數據, 其原有數據庫系統爲幾十個Oracle 9i RAC集羣. SOE分析業務後發現, Oracle數據庫過於昂貴, 且許可證限制過多, 缺乏靈活性, 最終SOE將其數據庫系統轉換爲穩定, 可擴展, 高性能的使用PG技術的EnterpriseDB數據庫.

Enterprise DB是提供基於PostgreSQL的企業級產品與服務廠商之一。

  1. Hi5社交網站

Hi5從2003發展開始已經成爲世界上最大的社交網站之一, 有超過200個國家的八千萬註冊用戶, 每個月用戶訪問量超過5600萬, 是在Alexa全球排名前20的網站; Hi5擁有一個運行在幾百萬臺服務器節點上的商業PG OLTP集羣, 這也是世界上最大的PG集羣, 運行着Hi5社交網絡的所有服務, 包括用戶數據, 配置信息, 圖片, 評論等數據, 並提供高效的檢索. 另外, FortiusOne, Florists’Transworld Delivery, NNT等公司都選擇廉價而高效的PG作爲其數據管理基礎設施, 取得了良好的應用效果.

  1. PG的國內的應用情況(知乎回答)

總的份額現在還不算非常大,不過上升挺快的。第一,因爲授權友善,代碼質量高,現在很多高校都用PostgreSQL爲原型做數據庫工程的研究項目。第二,現在的雲主機廠商越來越多的提供PostgreSQL數據源。第三,PostgreSQL比MySQL易用性好多了。這個居然還有人覺得MySQL佔優勢……我就說一句,我從2000年入行到現在,西方哪個流行的數據庫我沒用過?第四,企業自己維護的PostgreSQL數據庫越來越多,因爲基礎運維環境在不斷髮展,現在像我們這種創業企業用PostgreSQL比以前方便多了。PostgreSQL可以一站式實現幾乎所有的數據庫服務需求,這對於新創企業是非常有誘惑力的。第五,大企業的OLAP需求,越來越多的在用PG,前年鵝廠的同行介紹他們有一個70PB的PostgreSQL集羣,現在的規模肯定更大多了。阿里、百度、華爲這幾年對這個領域投入都在上升。第六,Greenplum開源,在今年會對PostgreSQL的發展有很大推動,這是業界非常有名的分佈式數據庫集羣技術,基於PostgreSQL。

PG代碼結構

初始化部分(Initialization)

bootstrap:用於支持Bootstrap運行模式, 該模式主要用來創建初始的模板數據庫. 和系統表相關。
main:主程序模塊, 它負責將控制權轉到Postmaster進程. 即傳遞參數到後臺的pg進程。
postmaster:監聽用戶請求的守護進程, 並控制Postgres進程的啓動和終止. 即, 控制pg服務開關,創建共享內存,循環等待連接並分配服務。
libpq:C/C++的庫函數, 處理與客戶端間的通信, 幾乎所有的模塊都依賴它.即, 與子進程通訊相關的庫。

查詢部分(Main Query Flow)

tcop:traffic cop(交警),Postgres服務進程的主要處理部分, 它調用Parser, Optimizer, Executor, 和 Commands中的函數來執行客戶端提交的查詢. 即分配請求到對應模塊如解析器、優化器、執行器和命令行功能。
parser:編譯器, 將SQL查詢轉化爲內部查詢樹. 即把sql語句轉化成查詢執行樹。
rewrite:查詢重寫, 根據規則系統對查詢進行重寫. 即規則和視圖支持部分。
optimizer:優化器, 根據查詢樹創建最優化的查詢路徑和查詢計劃. 即優化查詢路徑生成計劃。
optimizer_path:生成所有可能的路徑,檢查表連接順序,where條件限制,優化表的統計信息,對於可執行的計劃評估開銷。
optimizer_geqo:遺傳(或者是祖傳?)查詢優化器評估的路徑對於要連接的表,當表的數量很少時會給很優化的結果,表太大就直接給一個一般的,可以通過參數控制是否使用這個功能。
optimizer_plan:拿着“optimizer_path”的結果輸出最小開銷的路徑。
optimizer_prep:處理特殊的查詢計劃。
optimizer_util:優化支持部分。
executor:執行復雜的計劃包括,增刪改查。算子舉例:堆掃描、索引掃描、排序、連接、聚合、分組、去重等。

指令支持(Command Support)

commands:響應指令,以及簡單的功能如vacuum、create table直接在元數據(catalog)上面做了。
catalog:元數據,直接操作系統表和目錄,如索引、表、存儲過程、操作符等。
access:大量的數據訪問函數,如索引訪問、堆訪問、和事務日誌。
access_common:通用訪問方法。
access_gin:索引相關訪問。
access_gist:搜索樹相關訪問。
access_hash:哈希相關訪問方法。
access_heap:存儲數據行。
access_index:被索引類型使用。
access_nbtree:Lehman和Yao的B樹管理算法。
access_spgist:空間分片的全局特徵信息相關訪問。(GiST)
access_transam:事務管理,如日誌讀寫。(BEGIN/ABORT/COMMIT)
nodes:關於SQL查詢的創建或者操作叫做節點,節點一般都有類型和特殊的數據結構,節點間經常被放在鏈表裏。
storage:管理大量存儲系統,提供統一後臺訪問。
storage_buffer:共享緩存管理。
storage_file:文件管理。
storage_freespace:剩餘空間映射表。
storage_ipc:信號量和共享內存。
storage_large_object:超大對象。
storage_lmgr:鎖管理。
storage_page:頁管理。
storage_smgr:磁盤和存儲設備管理。
utils:工具類。
utils_adt:包含所有PG中內建數據類型(如bool、char、date)。
utils_cache:因爲PG支持很多隨意數據類型,後臺系統需要查詢一個系統表關於這些隨意類型時會先走這個緩存。
utils_error:錯誤反饋,從後端反饋到前端去。
utils_fmgr:函數管理,處理動態綁定的函數調用,和系統表中定義的函數調用。
utils_hash:哈希函數管理,被緩存和內存管理器使用以做快速查詢動態數據存儲結構。
utils_init:大量初始化。
utils_mb:單字節和多字節的編碼。
utils_misc:冗餘的東西(官方叫miscellaneous stuff)
utils_mmgr:內存管理(PG進程本地)。
utils_resowner:資源擁有者追溯。
utils_sort:排序工具,如對元祖排序。
utils_time:事務時間,與mvcc有關,判斷一個元祖是過期了還是未提交。

基礎支持(Support Facilities)

include:引用的文件。
lib:支持的庫,有二插堆,布隆過濾器。
port:兼容性部分。
regex:正則表達式。
snowball:語法庫,雪球是一個語法庫,各國語言的規範都有。
replication:通過日誌遷移支持流式備份。
tsearch:文本查詢庫用於支持全文查詢。

參考

<PG數據庫內核分析> 1 PostSQL系統概述
小麥帶你看postgres(代碼模塊結構)

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