大对象的实现将大对象分解成很多“数据块”并且将这些数据块存储在数据库的行中。一个B-tree索引用来保证在进行随机访问读写时能够根据数据块号快速地搜索到正确的数据块。
为一个大对象存储的数据块并不需要是连续的。例如,如果一个应用打开了一个新的大对象,移动到偏移量1000000并写了一些字节,这并不会导致分配1000000字节的存储,只有覆盖写入字节范围的数据块需要被分配。而一个读操作将会把现有最后的数据块之前还未分配的位置读出为0。这和Unix文件系统中“稀疏”文件的一般行为相对应。
自PostgreSQL 9.0起,大对象可以有一个拥有者和一组访问权限,它们可以用GRANT和REVOKE管理。读一个大对象需要SELECT
权限,而写或者截断一个大对象则需要UPDATE
权限。只有大对象的拥有者(或者一个数据库超级用户)可以创建大对象、注释大对象或修改大对象的拥有者。要调整这些行为以兼容以前的发行,请见lo_compat_privileges的运行时参数。