Chapter 29. 大对象

Table of Contents
29.1. 历史
29.2. 实现特点
29.3. 客户端接口
29.3.1. 创建大对象
29.3.2. 输入大对象
29.3.3. 输出大对象
29.3.4. 打开一个现有的大对象
29.3.5. 向大对象中写数据
29.3.6. 从大对象中读取数据
29.3.7. 大对象中数据的查找
29.3.8. 获取一个大对象的当前搜索位置
29.3.9. 关闭一个大对象描述符
29.3.10. 删除一个大对象
29.4. 服务器端函数
29.5. 例子程序

PostgreSQL 有一个大对象设施, 它为存储在特殊的大对象结构里的用户数据提供流状的访问方式。 流访问对那些数据值太大,因而不能一次性操作的数据是很有用的。

本章描述 PostgreSQL 大对象数据的实现以及编程和查询语言接口。 我们在本章中使用 libpq 的 C 库作为例子, 但是大多数 PostgreSQL 内置的接口都支持等效的功能。 其它接口可以在内部使用大对象接口以提供对大对象值的一般性支持。那些内容没有在这里描述。

29.1. 历史

最初,PostgreSQL 4.2PostgreSQL 的间接前身)支持三种大对象的标准实现: 作为 POSTGRES服务器外部的文件扩展, 作为由 POSTGRES 管理的外部文件, 以及作为存储在 POSTGRES 数据库里面的数据. 这样做容易导致用户的迷惑.结果是,我们只支持把大对象作为数据存储在 PostgreSQL 数据库里. 即使这样做令数据访问变得有些慢,但却保证了更严格的数据完整性. 由于历史原因,这种存储机制被称为转置大对象. (我们将在本章中交互使用转置和大对象来表示同一个意思)。 自 PostgreSQL 7.1 开始,所由大对象都保留在一个叫pg_largeobject的系统表里.

PostgreSQL 7.1 引入了一种新的机制 (外号叫 "TOAST"), 允许数据行远远大于单个数据页面。这样就令大对象接口在一定程度上过时了。 大对象接口剩余的一个优点是它允许数据最大有 2 G,而 TOAST 字段只能处理 1 G。 并且,大对象可以比普通数据值更容易地一片片操作,因此,实际地局限是不一定的。