Course contentsShow
← Databases & SQL
Lesson 901 of 1,9538. PostgreSQL InternalsFree lesson

Binary Data and Large Objects (LOB)

You will store and manage unstructured binary large objects using internal storage APIs.

Binary Data and Large Objects (LOB)

In this lesson, you will learn how to bypass standard row-size limitations by utilizing PostgreSQL’s Large Object (LOB) interface to store massive, unstructured binary data directly within the database.

The Storage Challenge

Standard data types like BYTEA are stored "in-line" within the table's heap. While efficient for small blobs, they struggle with massive files (like high-resolution images or gigabyte-scale logs) because they compete for space with your metadata. When data exceeds a certain size, PostgreSQL’s TOAST mechanism compresses or splits it, which can become a bottleneck during frequent read/write operations.

The Large Object (lo) Interface

PostgreSQL provides an alternative: the Large Object facility. Instead of storing the binary data directly in a row, the LOB facility stores data in a dedicated system table (pg_largeobject) in 2KB chunks. Your table row simply holds an OID (Object Identifier) that acts as a pointer to the storage.

This approach is highly performant for streaming because the database doesn't need to load the entire object into memory to access a specific segment. You interact with these objects through a specialized set of functions:

-- 1. Create a large object and get its OID
SELECT lo_creat(-1); -- Returns the OID, e.g., 16384

-- 2. Open the object for writing
SELECT lo_open(16384, 131072); -- 131072 is INV_WRITE

-- 3. In practice, you often use the lo_import() function to pull files 
-- directly from the server's filesystem:
SELECT lo_import('/tmp/large_archive.tar.gz');

Strategic Trade-offs

Because Large Objects exist outside the standard row-visibility rules, they do not participate in standard VACUUM processes the same way regular data does. If you delete a row that contains an OID, the Large Object is not automatically deleted. You must manually manage the lifecycle of these objects using lo_unlink(oid) to prevent "orphaned" storage that bloats your system tables.

Use LOBs when you have binary blobs that are too large to keep in-line or when your application requirements demand random-access streaming without loading the entire binary into memory.

Key Takeaway: Use the Large Object interface to manage massive binary data via OID pointers, keeping your primary table lean while enabling efficient, chunked access to unstructured files.