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。