在這篇論文之前 — 它所降落的世界
Stonebraker 先前已靠柏克萊的 Ingres 研究計畫與據此創辦的 RTI 取得巨大成功,因此 Postgres 明擺著就是 Post-Ingres:延續 Ingres 能做的事,再往前推。1980 年代初,他的團隊被微電子產業的 CAD 工具需求牽引:那些應用需要多邊形、矩形、字串等新型別,需要高效的空間搜尋、複雜的完整性約束,還需要同一個實體構造的設計階層與多重表示法。這股壓力催生了 Antonin Guttman 的 R-tree,以及把 abstract data type 硬掛上 Ingres 的原型 ADT-Ingres,後者甚至允許用一段 Quel 查詢當作欄位型別。同一時期,商業廠商正大舉投資高度最佳化的 write-ahead logging 與交易吞吐量以求差異化,而 AI 社群對規則式專家系統的熱情則已近尾聲。Postgres 同時逆著這幾股潮流設計,一個都沒有跟。
術語 — 依本篇論文的用法
- Object-Relational(物件關聯式)
- Stonebraker 為以下做法所取的名號:以使用者自訂型別、函式與巢狀欄位等物件導向特性去擴充關聯式資料模型與宣告式查詢語言,而不是像 OODB 陣營那樣讓程式語言物件可持久化。
- Abstract Data Type (ADT)
- 由使用者提供、存放在資料庫中但核心系統不去解讀的型別;引擎只知道如何把它搬進搬出,以及有哪些已登記的函式能作用其上。
- User-Defined Function (UDF)
- 登記到系統中、供查詢對 ADT 欄位呼叫的應用程式碼。Postgres 同時支援 user-defined aggregate,並且是第一個把每個函式的成本與選擇率記入目錄的 DBMS。
- 複合物件(complex object)
- 值本身即為巢狀結構的欄位,可以是 tuple 或資料表;在 ADT-Ingres 一脈中甚至可以是一段被當成資料型別的 Quel 查詢,讓非第一正規化的資料能住在一般的關聯式資料表裡。
- 可擴展存取方法(extensible access method)
- 透過一份「我能回答哪些述詞」的抽象描述登記進系統的索引結構,使查詢最佳化器能把抽象的 selection 述詞對應到它。R-tree 是主要推動範例,GiST 則是後來的一般化成果。
- no-overwrite 儲存
- Postgres 的儲存紀律:更新不就地修改資料,而是在該筆記錄以 transaction ID 標記的版本鏈上追加一個新版本,使主要資料與歷史日誌成為同一份結構。
- Time travel(時光旅行查詢)
- 以「as of 某個過去時間點」執行查詢,做法是比對已提交 transaction ID 清單與其時間戳記,挑出當時已提交的 tuple 版本。
- Fast Path
- 直接暴露資料庫儲存內部的 C/C++ 介面,用來讓 Postgres 跳過查詢剖析與最佳化,在 OODB 產品自家的基準測試上與之競爭。
- The Wei Hong Optimizer
- Stonebraker 為 XPRS 這套做法所取的名字:先把查詢當成單機查詢來最佳化,再替這份完成的計畫安排各運算子的平行度與擺放位置,藉此平行化。