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/kb/Планировщик и оптимизатор/access-methods

kb/planner ── Планировщик и оптимизатор ── intermediate

Методы доступа: Seq, Index, Bitmap, Index-Only

Четыре способа достать строки: Seq Scan (всё подряд), Index Scan (мало строк, random I/O), Bitmap Heap Scan (средняя доля, страницы пачкой), Index-Only Scan (данные из индекса, если visibility map подтверждает).

view as markdownaka: scan-types, seq-scan, bitmap-scan, index-only-scan

Выбор метода доступа определяется селективностью (см. selectivity-crossover).

Четыре метода

  • Seq Scan - читает все страницы последовательно, фильтрует строки; стоимость не зависит от условия. Выгоден при большой доле строк.
  • Index Scan - спускается по индексу (какой именно подойдёт под условие, решает operator-classes) и за каждой строкой идёт в таблицу случайным чтением. Дёшев при малой доле, дорог при большой.
  • Bitmap Heap Scan - Bitmap Index Scan строит карту совпадающих страниц, Bitmap Heap Scan читает их в физическом порядке по разу. Компромисс для средней доли; карты можно пересекать (BitmapAnd/Or).
  • Index-Only Scan - берёт данные прямо из индекса, не трогая таблицу, если все нужные колонки в индексе и visibility map подтверждает видимость страницы.

Index-Only Scan и Heap Fetches

Индекс не хранит видимость версий - её подтверждает visibility-map. Если бит all-visible не выставлен, приходится идти в таблицу:

Index Only Scan ...  Heap Fetches: 4310   ← VM не выставлена

Большой Heap Fetches лечится VACUUM - он выставляет visibility map, и при следующем запуске становится Heap Fetches: 0.

sql
EXPLAIN (ANALYZE) SELECT k FROM big WHERE k = 7;   -- Index Only Scan

§ команды

bash
EXPLAIN SELECT * FROM t WHERE c = 7;

Узкое условие - Index или Bitmap Scan

bash
CREATE INDEX ON t (c) INCLUDE (extra);

Покрывающий индекс под Index-Only Scan

bash
VACUUM t;

Выставить visibility map - убрать Heap Fetches у Index-Only Scan

§ см. также

  • selectivity-crossoverСелективность и точка переломаСелективность - доля строк, проходящих условие. Index Scan дёшев при малой доле и круто дорожает; Seq Scan стоит одинаково. Линии пересекаются на единицах процентов - это точка перелома, зависит от random_page_cost.
  • join-algorithmsАлгоритмы соединения: nested loop, hash, mergeNested loop хорош при малом внешнем входе и индексе внутри; hash join - для больших входов по равенству (нужен work_mem); merge join - когда входы уже отсортированы. Memoize кеширует поиски nested loop.
  • cost-modelСтоимостная модельСтоимость - условные единицы, где последовательное чтение страницы = 1.0. Seq Scan стоит relpages × seq_page_cost + reltuples × cpu_tuple_cost. Планировщик выбирает план с минимальной оценкой, а не «правильный».
  • operator-classesOperator classes и выбор индексаИндекс работает не «на колонке», а для конкретных операторов над ней. Связь тип+оператор+метод доступа задаёт operator class. Через каталог pg_amop можно узнать, какой AM поддерживает оператор: @> знают gin и gist, не btree.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки