Как в PostgreSQL хранятся объекты размером больше 2 Кб

«Как в PostgreSQL хранятся объекты размером больше 2 Кб» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В PostgreSQL большие объекты (LOB — Large OBjects) хранятся в специальной системной таблице pg_largeobject. Если размер данных превышает 2 КБ, PostgreSQL автоматически разбивает их на "чанки" (фрагменты) по 2 КБ и сохраняет их в этой таблице. Каждый чанк имеет уникальный идентификатор (LOID — Large Object ID), который связывает все фрагменты одного объекта.

Пример работы с большими объектами:

import (
    "database/sql"
    _ "github.com/lib/pq"
)

func storeLargeObject(db *sql.DB, data []byte) error {
    tx, err := db.Begin()
    if err != nil {
        return err
    }
    lo := tx.QueryRow("SELECT lo_create(0)")
    var oid int32
    if err := lo.Scan(&oid); err != nil {
        tx.Rollback()
        return err
    }
    obj, err := tx.Exec("INSERT INTO pg_largeobject VALUES ($1, 0, $2)", oid, data)
    // ...
    return tx.Commit()
}

Для работы с LOB в PostgreSQL есть специальные функции: lo_create(), lo_import(), lo_export() и другие. В приложениях обычно используют эти функции или драйверы с поддержкой LOB.