Chapter 28. 大對象

Table of Contents
28.1. 歷史
28.2. 實現特點
28.3. 客戶端接口
28.3.1. 創建大對象
28.3.2. 輸入大對象
28.3.3. 輸出大對象
28.3.4. 打開一個現有的大對象
28.3.5. 向大對象中寫數據
28.3.6. 從大對象中讀取數據
28.3.7. 對大對象中數據的查找
28.3.8. 獲取一個大對象的當前搜索位置
28.3.9. 關閉一個大對象描述符
28.3.10. 刪除一個大對象
28.4. 服務器端函數
28.5. 例子程序

PostgreSQL 7.1 以前的版本裡, 記錄存儲在數據頁面裡並且單個記錄裡的數據大小不能超過數據頁面的大小。 因為數據頁面大小是8192 字節(缺省,可以增加到 32768), 所以可存儲數據值的上限是相當低的。為了存儲更大的原子數值, PostgreSQL 提供了大對象接口。 這個接口給用戶提供對存儲在特殊大對象結構的用戶數據的面向文件的接口。

本章描述 PostgreSQL 大對象數據的實現以及編程和查詢語言接口。 我們在本章中使用 libpq 的 C 庫作為例子, 但是大多數 PostgreSQL 內置的接口都支持等效的功能。 其它接口可以在內部使用大對象接口以提供對大對象值的一般性支持。那些內容沒有在這裡描述。

28.1. 歷史

最初,PostgreSQL 4.2PostgreSQL 的間接前身)支持三種大對象的標準實現: 作為 POSTGRES服務器外部的文件擴展, 作為由 POSTGRES 管理的外部文件, 以及作為存儲在 POSTGRES 數據庫裡面的數據. 這樣做容易導致用戶的迷惑.結果是,我們只支持把大對象作為數據存儲在 PostgreSQL 數據庫裡. 即使這樣做令數據訪問變得有些慢,但卻保證了更嚴格的數據完整性. 由于歷史原因,這種存儲機制被稱為轉置大對象. (我們將在本章中交互使用轉置和大對象來表示同一個意思)。 自 PostgreSQL 7.1 開始,所由大對象都保留在一個叫pg_largeobject的系統表裡.

PostgreSQL 7.1 引入了一種新的機制(外號叫 "TOAST"),允許數據行 遠遠大于獨立的數據頁面。這樣就令大對象接口在一定程度上過時了。 大對象接口剩餘的一個優點是它允許數據最大有 2 G,而 TOAST只能處理 1 G。