SQL Academy · Урок

Сканирование только по индексу и карта видимости

Используйте сканирование только по индексу, создавая покрывающие запросы и поддерживая карту видимости в актуальном состоянии

Урок 4 из 414 шагов

«Сканирование только по индексу и карта видимости» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Что такое сканирование только по индексу?

Обычно поиск по индексу возвращает идентификаторы строк (TID), после чего для чтения самой строки нужно обратиться к таблице. Сканирование только по индексу выполняет запрос, используя один лишь индекс, без обращения к куче. Это значительно быстрее.

Условия

Для сканирования только по индексу требуется:

  • Все выбранные столбцы должны входить в индекс
  • Страница строки должна быть отмечена в карте видимости как «полностью видимая»

Карта видимости

Для каждой страницы таблицы хранится битовая карта: установленный бит означает, что «все строки на этой странице видимы для всех транзакций». VACUUM поддерживает её в актуальном состоянии. Без неё PostgreSQL должен обращаться к куче, чтобы проверить видимость.

Сделайте запрос выполняемым только по индексу

Включите все необходимые столбцы:

-- Query:
SELECT id, email FROM users WHERE id = 42;

-- Without an index on (id, email), only an Index Scan that visits the heap is possible.
-- With this:
CREATE INDEX users_id_email_idx ON users (id, email);
-- Or better:
CREATE INDEX users_id_email_idx ON users (id) INCLUDE (email);
-- The query can be index-only.

INCLUDE

Покрывающий индекс с неключевыми столбцами (в PG 11 и более новых версиях). Столбец хранится в листовых страницах, но не используется для упорядочивания, поэтому не влияет на стоимость вставки:

CREATE INDEX users_id_idx ON users(id) INCLUDE (email, full_name);

SELECT id, email, full_name FROM users WHERE id = 42;
-- Index-only scan if visibility map allows.

Почему обращение к куче всё ещё может происходить

После большого числа операций записи карта видимости может устареть. Запустите VACUUM (без FULL), чтобы обновить её.

VACUUM (VERBOSE) users;
-- "scanned X pages, X of which are visible"
-- More visible pages = more Index-Only Scans possible.

Проверка сканирования только по индексу

Это показывает план выполнения:

EXPLAIN ANALYZE
SELECT id, email FROM users WHERE id = 42;
--  Index Only Scan using users_id_email_idx on users
--    Index Cond: (id = 42)
--    Heap Fetches: 0       ← key number

Что показывают обращения к куче

«Обращения к куче: 0» — идеально, все данные получены из индекса. «Обращения к куче: N» — для N строк потребовалось обращение к куче (бит карты видимости не установлен). После запуска автовакуума число обращений к куче обычно уменьшается.

Когда использовать INCLUDE, а когда составной индекс

  • Используйте INCLUDE для столбцов, которые только выбираются (но не используются для фильтрации или сортировки)
  • Используйте составной индекс (ключевой столбец), если столбец также участвует в фильтрации или сортировке

INCLUDE сохраняет индекс более компактным и ускоряет операции записи.

Раздувание индекса мешает сканированию только по индексу

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

Не включайте в индекс всё подряд

Добавление слишком большого числа столбцов в индекс замедляет запись и сильно увеличивает размер индекса. Включайте только те пути чтения, которые активно используются.

Материализованные представления как покрытие

Если для конкретного отчёта нужна исключительно высокая скорость чтения, материализованное представление с индексом фактически становится «покрывающим индексом» с произвольными вычисляемыми столбцами.

Итоги

Сканирование только по индексу — самый быстрый путь чтения.

  • Все выбранные столбцы должны входить в индекс
  • INCLUDE недорого добавляет неключевые столбцы
  • Карта видимости должна показывать «полностью видимую» страницу — VACUUM поддерживает её в актуальном состоянии
  • В плане выполнения цель — «Обращения к куче: 0»

Быстрая проверка

В плане выполнения вы видите «Обращения к куче: 100 000», несмотря на узел сканирования только по индексу. Какое исправление обычно помогает?

Можно начать бесплатно

Изучай SQL с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
46
Уроки
183

Часто задаваемые вопросы

Урок «Сканирование только по индексу и карта видимости» бесплатный?

Да — полный текст урока «Сканирование только по индексу и карта видимости» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «Сканирование только по индексу и карта видимости»?

Используйте сканирование только по индексу, создавая покрывающие запросы и поддерживая карту видимости в актуальном состоянии Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Сканирование только по индексу и карта видимости»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. MVCC и причины раздувания
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE и pg_statistic
  4. Сканирование только по индексу и карта видимости
← Назад к SQL Academy