Выбор метода доступа определяется селективностью (см. 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