PostgreSQL has a large object facility, which provides stream-style access to user data that is stored in a special large-object structure. Streaming access is useful when working with data values that are too large to manipulate conveniently as a whole.
This chapter describes the implementation and the programming and query language interfaces to PostgreSQL large object data. We use the libpq C library for the examples in this chapter, but most programming interfaces native to PostgreSQL support equivalent functionality. Other interfaces may use the large object interface internally to provide generic support for large values. This is not described here.
POSTGRES 4.2, the indirect predecessor
of PostgreSQL, supported three standard
implementations of large objects: as files external to the
POSTGRES server, as external files
managed by the POSTGRES server, and as
data stored within the POSTGRES
database. This caused considerable confusion among users. As a
result, only support for large objects as data stored within the
database is retained in PostgreSQL.
Even though this is slower to access, it provides stricter data
integrity. For historical reasons, this storage scheme is
referred to as Inversion large
objects. (You will see the term Inversion used
occasionally to mean the same thing as large object.) Since
PostgreSQL 7.1, all large objects are
placed in one system table called
PostgreSQL 7.1 introduced a mechanism (nicknamed "TOAST") that allows data values to be much larger than single pages. This makes the large object facility partially obsolete. One remaining advantage of the large object facility is that it allows values up to 2 GB in size, whereas TOASTed fields can be at most 1 GB. Also, large objects can be manipulated piece-by-piece much more easily than ordinary data fields, so the practical limits are considerably different.