Зачем INCLUDE в покрывающем индексе PostgreSQL

User_id участвует в поиске, а name хранится как дополнительная полезная нагрузка. Это создаёт возможность index-only scan, но не гарантирует его для каждого выполнения.

Короткий ответ

Что ответить на собеседовании

User_id участвует в поиске, а name хранится как дополнительная полезная нагрузка. Это создаёт возможность index-only scan, но не гарантирует его для каждого выполнения.

Подробный разбор

Ответ с пояснениями

Условие

Запрос выбирает name по точному user_id: SELECT name FROM profiles WHERE user_id = $1. Рассматривается индекс (user_id) INCLUDE (name). Чем включённое поле отличается от ключа?

Ответ

User_id участвует в поиске, а name хранится как дополнительная полезная нагрузка. Это создаёт возможность index-only scan, но не гарантирует его для каждого выполнения.

Пример: CREATE INDEX ON profiles (user_id) INCLUDE (name). Видимость строк по MVCC всё ещё нужно проверять, и иногда требуется чтение таблицы. INCLUDE увеличивает размер индекса и стоимость записи; широкие поля включайте осознанно. Уникальность такого индекса определяется ключевыми колонками, не payload.

Источник: www.postgresql.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее