TGViewer
SQL Ready | Базы Данных SQL Ready | Базы Данных @sql_ready · 17.5K subscribers
Post #2049 1.86K
Почему JSONB в PostgreSQL не всегда быстрее JSON!

В PostgreSQL тип JSONB часто выбирают вместо JSON из-за возможности индексации и работы с операторами поиска. Но отличие между ними не только в скорости чтения — оно связано с тем, как PostgreSQL хранит, обрабатывает и изменяет данные.

Рассмотрим таблицу с JSONB-структурой:
CREATE TABLE events (
id SERIAL PRIMARY KEY,
payload JSONB
);


Добавим документ с вложенными данными:
INSERT INTO events (payload)
VALUES (
'{
"user": {
"id": 100,
"role": "admin"
},
"active": true
}'
);


При хранении JSONB PostgreSQL разбирает документ и сохраняет его во внутреннем бинарном представлении. Благодаря этому можно выполнять поиск по содержимому документа:
SELECT *
FROM events
WHERE payload @> '{"active": true}';


Оператор @> проверяет наличие указанного фрагмента внутри JSONB-объекта.

Для ускорения подобных запросов используется GIN-индекс:
CREATE INDEX idx_events_payload
ON events
USING GIN (payload);


После создания индекса PostgreSQL может выполнять поиск внутри JSONB-структуры без полного последовательного просмотра всех строк. Но у JSONB есть особенности, которые важно учитывать.

При изменении одного поля PostgreSQL не изменяет отдельный элемент внутри JSONB-документа. Из-за механизма MVCC создаётся новая версия строки с новым значением JSONB:
UPDATE events
SET payload = jsonb_set(
payload,
'{user,role}',
'"moderator"'
)
WHERE id = 1;


Для небольших объектов это обычно не оказывает заметного влияния. Но большие JSONB-документы с частыми обновлениями могут увеличивать нагрузку на операции записи из-за необходимости создавать новые версии данных.

Ещё одно отличие связано с сохранением структуры документа. В типе JSON PostgreSQL сохраняет текстовое представление документа:
SELECT '{"b":2,"a":1}'::json;


В этом случае исходный порядок ключей сохраняется. JSONB хранит уже разобранную структуру документа:
SELECT '{"b":2,"a":1}'::jsonb;


В JSONB порядок ключей не сохраняется, поскольку PostgreSQL работает с внутренним структурированным представлением данных. Поэтому он лучше подходит для случаев, когда требуется поиск, индексация и работа с содержимым документа, а JSON — когда важно сохранить исходное представление данных.

Отдельно стоит учитывать особенности работы индексов. Например, запрос с извлечением значения через оператор ->> выглядит следующим образом:
SELECT *
FROM events
WHERE payload->>'active' = 'true';


А запрос с проверкой содержимого JSONB-объекта использует другой механизм доступа:
SELECT *
FROM events
WHERE payload @> '{"active": true}';


GIN-индекс эффективно работает с операторами JSONB, такими как проверка вхождения @>, проверка существования ключей ?, а также операторы проверки нескольких ключей ?| и ?&.

Однако GIN-индекс не ускоряет автоматически любые выражения с извлечением значений через ->>. Для таких случаев могут использоваться отдельные функциональные индексы.

Например, индекс для конкретного поля JSONB можно создать следующим образом:
CREATE INDEX idx_events_active
ON events ((payload->>'active'));


Если поле активно используется в фильтрации, сортировке или связях между таблицами, отдельная колонка часто будет эффективнее и проще для поддержки.

🔥 JSONB отлично подходит для хранения динамических структур, когда требуется гибкость схемы и возможность выполнять поиск по содержимому. Главное правило: JSONB — это инструмент для работы с полуструктурированными данными, а не способ заменить полноценную структуру реляционной базы данных.

➡️ SQL Ready | #практика
  • 👍 11
  • 🤝 7
  • 🔥 3
More from @sql_ready
  1. Oct 5, 2026COUNT(*) в PostgreSQL: MVCC, visibility map и стоимость выполнения! В PostgreSQL точный CO…
  2. Oct 5, 2026Как оплачивать зарубежные сервисы в 2026 году? Можно бегать между посредниками и бояться б…
  3. Oct 5, 2026Проверяйте JSON без преобразования! Если JSON приходит как text, необязательно делать ::js…
  4. Oct 2, 2026Настройте оценку пользовательских функций! Для пользовательской функции PostgreSQL позволя…
  5. Oct 2, 2026🔎 Гибридный поиск в YDB: когда SQL ищет не только по словам В YDB, созданном Yandex B2B T…
  6. Oct 2, 2026😍 SQL-Tutorial — бесплатный учебник по SQL с практическими заданиями! Онлайн-учебник для…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →