Выбор ответа Senior Индексы обновлено
Покрывающий индекс
Вопрос
Запрос SELECT customer_id, total FROM orders WHERE customer_id = 7 часто вызывается. Что даст индекс CREATE INDEX ON orders (customer_id) INCLUDE (total)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Index Only Scan: нужные колонки уже лежат в индексе. Колонки из INCLUDE хранятся в листьях индекса, но не участвуют в ключе.
Варианты ответа
- Уникальность пары
(customer_id, total)в таблице - Сортировку результата по
totalбез отдельного шага - Index Only Scan: нужные колонки уже лежат в индексеправильный ответ
- Индекс по
totalдля запросовWHERE total > 1000
Разбор
Колонки из INCLUDE хранятся в листьях индекса, но не участвуют в ключе. Поэтому запрос может взять всё из индекса и не ходить в таблицу. Оговорка: PostgreSQL проверяет видимость строки по visibility map, и для «грязных» страниц всё равно заглядывает в таблицу, поэтому важен VACUUM. Уникальность INCLUDE-колонки не затрагивает, сортировку по ним не даёт и искать по ним нельзя.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.