第 28 章 大对象
目录
在 7.1 之前的 PostgreSQL 版本中,数据库中任何一行的大小都不能超过一个数据页的大小。由于数据页的大小是 8192 字节(默认值,最高可以提高到 32768),数据值大小的上限相对较低。为了支持更大的原子值的存储,PostgreSQL 过去提供了、而且现在仍然提供大对象接口。该接口以面向文件的方式访问存储在特殊的大对象结构中的用户数据。
本章介绍PostgreSQL大对象数据的实现,以及相应的编程接口和查询语言接口。本章示例使用libpq C 库,但大多数PostgreSQL原生编程接口都支持等效的功能。其他接口也可能在内部使用大对象接口来为大值提供通用支持,这里不作说明。
28.1. 历史 #
PostgreSQL的间接前身
POSTGRES 4.2支持三种标准的大对象实现:作为POSTGRES服务器外部的文件、作为由
POSTGRES服务器管理的外部文件,以及作为存储在POSTGRES数据库内部的数据。这在用户中造成了相当大的混乱。因此,PostgreSQL
中只保留了把大对象作为数据库内部存储数据的支持。虽然这样访问速度较慢,但它提供了更严格的数据完整性。由于历史原因,这种存储方案被称为Inversion 大对象。(你会看到
Inversion 一词偶尔也被用来表示大对象的同义词。)从
PostgreSQL 7.1开始,所有大对象都存放在一个名为pg_largeobject的系统表中。
PostgreSQL 7.1 引入了一种机制(绰号 “TOAST”),它允许数据行远大于单个数据页。这使大对象接口在一定程度上过时了。大对象接口剩下的一个优点是它允许最大 2 GB 的值,而 TOAST 只能处理 1 GB。