歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> Linux文化

分析Postgresql源代碼


在dbms的實現中,查找是一個要頻繁進行的動作,有根據用戶的請求而需要進行的外部數據庫中數據的查找,也有dbms對自己所使用的內部數據的查找。索引可以大大加快查找的速度,hash表在沒有沖突或者沖突較少時絕對是一種最佳的索引。postgresql的實現中包含了兩個類型的hash表,一個是用做存取方法的外存hash表,另一個是用於內布數據查找的內存hash表。本篇將對後者進行討論,源代碼在utils/hash之下,仍然是我先發言如下。

我學過數據結構的人,也看過數據庫管理系統實現一書,我總是覺得hash表這個東西說來簡單,但卻似乎沒有什麼用途。不過在我粗粗了解了postgresql的實現之後,不能不驚呼,hash表真是太有用了!如果你沒有寫過hash表的實現算法,建議你一定要認真讀讀postgresql的內存hash表的實現代碼。讀這部分代碼花了我兩個多星期,中間還因為上班遲到被老板k了一頓,但是讀懂以後我覺得非常的快樂,從理論到實現再到應用,全部都走一遍,哈哈,爽!

這部分代碼的關鍵之處在於它實現的是可動態增長hash表,很容易知道,有兩種動態hash表,那麼,postgresql實現的是哪一種呢?

首先說查詢優化主要所涉及的數據類型:

.\SRC\INCLUDE\NODES中的幾個文件均包括了

----> ParseNodes.H 語法分析之後所形成數據結構的類型 ----> PlanNodes.H 這個是經過優化之後的查詢計劃數據結構的類型 ----> ExecNodes.H 這個是執行器在執行查詢計劃時使用的數據結構的類型

等等,可以說,數據庫系統執行的主線,主要就是這幾個數據結構的生成和轉換。

然後說幾個主要的入口點:

Pgl的Core的幾個主要的入口點都在:

.\SRC\BACKEND\EXECUTOR\SPI.C 中,所謂的SPI就是“Server Programming Interface”(服務器編程接口)

比如:_SPI_execute主要是由SQL語句轉換為AccessPlan

就主要的查詢語句而言:_SPI_execute調用了

pg_parse_and_rewrite :這個是SQL語句語法分析,語義檢查和基於規則的重寫。 planner:這個是Pgl查詢優化器的入口點。 (當然pg_parse_and_rewrite進一步調用了pg_parse_query和pg_analyze_and_rewrite,而pg_analyze_and_rewrite調用了parse_analyze和QueryRewrite)

而: _SPI_execute_plan 則主要是對AccessPlan的執行

基本框架差不多就是這樣了

·如果你的linux安裝盤不止一張光盤,那麼可能其中一張會帶有postgresql的源代碼

·我通常直接到http://www.postgresql.org/或者ftp://ftp.postgresql.org/pub/下載源代碼

·可以用教育網的天網搜索引擎http://e.pku.edu.cn搜索postgresql來尋找國內的下載站點,不過這些下載站點多屬於教育網,我們訪問起來有點慢


摘自:linuxforum.net


Copyright © Linux教程網 All Rights Reserved