Chapter 2. 大对象

Table of Contents
2.1. 介绍
2.2. 实现特点
2.3. 接口
2.3.1. 创建大对象
2.3.2. 输入大对象
2.3.3. 输出大对象
2.3.4. 打开一个现有的大对象
2.3.5. 向大对象中写数据
2.3.6. 从大对象中读取数据
2.3.7. 对大对象中数据的查找
2.3.8. 关闭一个大对象描述符
2.3.9. 删除一个大对象
2.4. 内建的已注册函数
2.5. 通过Libpq 访问大对象

2.1. 介绍

PostgreSQL 7.1 以前的版本里, 记录存储在数据页面里并且单个记录里的数据大小不能超过数据页面的大小. 因为数据页面大小是8192 字节(缺省,可以增加到 32768), 所以可存储数据值的上限是相当底的. 为了存储更大的原子数值, PostgreSQL 提供了大对象接口. 这个接口给用户提供对定义为大对象的用户数据的面向文件的接口.

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

PostgreSQL 7.1 引入了一种新的机制 (外号叫 "TOAST"),允许数据行 远远大于独立的数据页面.这样就令大对象接口在一定程度上过时了. 大对象接口剩余的一个优点是它允许对数据的随机访问,也就是说, 可以读写小块的大对象.我们准备在将来的版本中为 TOAST 也装备上这样的功能.

本节描述 PostgreSQL 大对象接口 的实现和编程及查询语言接口.我们在本章中使用 libpq C 库作为例子, 但大多数 PostgreSQL 内置的编程接口 都支持相同的功能.其它接口可以在内部使用大对象接口以便为 大对象数值提供通用的支持.这里没有描述这些.