Сканирование только по индексу и карта видимости
Используйте сканирование только по индексу, создавая покрывающие запросы и поддерживая карту видимости в актуальном состоянии
«Сканирование только по индексу и карта видимости» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- MVCC и причины раздувания
- VACUUM, autovacuum, vacuum_cost_delay
- ANALYZE и pg_statistic
- Сканирование только по индексу и карта видимости