# Методы доступа: Seq, Index, Bitmap, Index-Only _Планировщик и оптимизатор · PostgreSQL Knowledge Base_ **TL;DR:** Четыре способа достать строки: Seq Scan (всё подряд), Index Scan (мало строк, random I/O), Bitmap Heap Scan (средняя доля, страницы пачкой), Index-Only Scan (данные из индекса, если visibility map подтверждает). Выбор метода доступа определяется селективностью (см. [selectivity-crossover](/courses/postgres/kb/selectivity-crossover.md)). ## Четыре метода - **Seq Scan** - читает все страницы последовательно, фильтрует строки; стоимость не зависит от условия. Выгоден при большой доле строк. - **Index Scan** - спускается по индексу (какой именно подойдёт под условие, решает [operator-classes](/courses/postgres/kb/operator-classes.md)) и за каждой строкой идёт в таблицу случайным чтением. Дёшев при малой доле, дорог при большой. - **Bitmap Heap Scan** - `Bitmap Index Scan` строит карту совпадающих страниц, `Bitmap Heap Scan` читает их в физическом порядке по разу. Компромисс для средней доли; карты можно пересекать (BitmapAnd/Or). - **Index-Only Scan** - берёт данные прямо из индекса, не трогая таблицу, если все нужные колонки в индексе и visibility map подтверждает видимость страницы. ## Index-Only Scan и Heap Fetches Индекс не хранит видимость версий - её подтверждает [visibility-map](/courses/postgres/kb/visibility-map.md). Если бит 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 ``` ## Команды ```sql EXPLAIN SELECT * FROM t WHERE c = 7; ``` Узкое условие - Index или Bitmap Scan ```sql CREATE INDEX ON t (c) INCLUDE (extra); ``` Покрывающий индекс под Index-Only Scan ```sql VACUUM t; ``` Выставить visibility map - убрать Heap Fetches у Index-Only Scan ## См. также - [Селективность и точка перелома](/courses/postgres/kb/selectivity-crossover.md) - [Алгоритмы соединения: nested loop, hash, merge](/courses/postgres/kb/join-algorithms.md) - [Стоимостная модель](/courses/postgres/kb/cost-model.md) - [Operator classes и выбор индекса](/courses/postgres/kb/operator-classes.md)