Выбор ответа Senior Индексы обновлено

Покрывающий индекс

Вопрос

Запрос SELECT customer_id, total FROM orders WHERE customer_id = 7 часто вызывается. Что даст индекс CREATE INDEX ON orders (customer_id) INCLUDE (total)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Index Only Scan: нужные колонки уже лежат в индексе. Колонки из INCLUDE хранятся в листьях индекса, но не участвуют в ключе.

Варианты ответа

  1. Уникальность пары (customer_id, total) в таблице
  2. Сортировку результата по total без отдельного шага
  3. Index Only Scan: нужные колонки уже лежат в индексеправильный ответ
  4. Индекс по total для запросов WHERE total > 1000

Разбор

Колонки из INCLUDE хранятся в листьях индекса, но не участвуют в ключе. Поэтому запрос может взять всё из индекса и не ходить в таблицу. Оговорка: PostgreSQL проверяет видимость строки по visibility map, и для «грязных» страниц всё равно заглядывает в таблицу, поэтому важен VACUUM. Уникальность INCLUDE-колонки не затрагивает, сортировку по ним не даёт и искать по ним нельзя.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.