User_id участвует в поиске, а name хранится как дополнительная полезная нагрузка. Это создаёт возможность index-only scan, но не гарантирует его для каждого выполнения.
Зачем INCLUDE в покрывающем индексе PostgreSQL
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.