linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/lessons/pg-lab-27-1-access-methods

lesson ── postgres-labs ── ~25 мин ── 5 шагов

Проведи запрос от Seq Scan до Index-Only Scan

Меняя только границу в WHERE, проведём один запрос через все методы доступа: Seq Scan на широком условии, Index/Bitmap на узком, Index-Only Scan, когда таблицу можно не трогать. Запусти psql во вкладке client.

▶ интерактивный sandbox

Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.

запустить sandbox →

stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Создай таблицу побольше с индексом

    sql
    CREATE TABLE big AS SELECT g AS id, (g % 1000) AS k FROM generate_series(1, 200000) g;
    CREATE INDEX ON big(k);
    ANALYZE big;
    подсказка

    200 тысяч строк хватит, чтобы планы стали реалистичными.

    ✓ Таблица и индекс готовы.

  2. 02

    Узкое условие - индексный доступ

    sql
    EXPLAIN SELECT * FROM big WHERE k = 7;

    Мало строк - планировщик берёт индекс (Index Scan или Bitmap Index Scan). Предскажи тип перед проверкой.

    подсказка

    При малой доле строк индекс дешевле полного прохода.

    ✓ Узкое условие ушло в индексный доступ.

  3. 03

    Широкое условие - Seq Scan

    sql
    EXPLAIN SELECT * FROM big WHERE k < 900;

    Почти вся таблица - индекс невыгоден, планировщик читает всё подряд.

    подсказка

    Когда нужна большая доля строк, Seq Scan дешевле случайных обращений.

    ✓ Широкое условие - Seq Scan, как и ожидалось.

  4. 04

    Запрос покрыт индексом, но VM ещё не выставлена

    Просим только проиндексированную колонку - в таблицу за данными идти не надо, всё есть в индексе:

    sql
    EXPLAIN SELECT k FROM big WHERE k = 7;

    План использует индекс. Но чистого Index-Only Scan пока нет: visibility map не выставлена, поэтому планировщик не уверен, что строки видны всем, и берёт обычный индексный доступ. Предскажи тип узла перед проверкой.

    подсказка

    Без visibility map планировщик не выбирает Index-Only Scan - индекс используется, но обычный.

    ✓ Запрос покрыт индексом; до VACUUM это ещё не Index-Only Scan.

  5. 05

    VACUUM выставляет visibility map - оживает Index-Only Scan

    sql
    VACUUM big;
    EXPLAIN ANALYZE SELECT k FROM big WHERE k = 7;

    После VACUUM visibility map выставлена, и план становится Index Only Scan с Heap Fetches: 0 - в таблицу больше не ходим.

    подсказка

    Индекс не хранит видимость; её подтверждает visibility map, которую ставит VACUUM.

    ✓ Heap Fetches: 0 - Index-Only Scan работает в полную силу.

Что ты узнал

Четыре метода доступа выбираются по селективности: Seq Scan (большая доля), Index/Bitmap Scan (малая и средняя), Index-Only Scan (все колонки в индексе). Index-Only Scan проверяет видимость через visibility map; пока VACUUM её не выставил, видны Heap Fetches.

команды

  • EXPLAIN SELECT * FROM t WHERE c = 7;посмотреть метод доступа
  • VACUUM t;выставить visibility map - убрать Heap Fetches

концепции

  • · Seq Scan выгоден при большой доле строк, индекс - при малой
  • · Bitmap Heap Scan читает страницы пачкой в физическом порядке
  • · Index-Only Scan не трогает таблицу, если колонки в индексе и VM выставлена
  • · Heap Fetches > 0 значит, что VACUUM ещё не выставил visibility map

← предыдущая

Предскажи селективность и почини корреляцию

следующая →

Получи hash, merge и nested loop на одном JOIN

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки