Селективность определяет, какой метод доступа выгоднее (см. access-methods).
Что такое селективность
Это доля строк таблицы, удовлетворяющих условию. flight_id = 7 может
иметь селективность 0.2% (мало строк), departure = 'SVO' - 80%
(много). Планировщик выводит её из статистики (см. planner-statistics)
и умножает на число строк, получая оценку rows.
Точка перелома
стоимость
│ Seq Scan ────────────────── (не зависит от доли)
│ ╱ Index Scan (круто растёт: random I/O на строку)
│ ╱
└──┴──────────────────── доля строк
^ перелом (~2-5%)
Index Scan дёшев при малой доле, но каждая строка - случайное обращение
к таблице (random_page_cost), поэтому стоимость растёт быстро. Seq
Scan читает всё последовательно за одну цену. Левее перелома выгоден
индекс, правее - Seq Scan, в середине - Bitmap Heap Scan.
От чего зависит место перелома
В первую очередь от random_page_cost. Снизишь его (например, на SSD) -
индексный доступ станет дешевле, и перелом сдвинется вправо: индекс
будет выбираться на большей доле строк.
EXPLAIN SELECT * FROM big WHERE k = 7; -- мало строк → Index/Bitmap
EXPLAIN SELECT * FROM big WHERE k < 900; -- много строк → Seq Scan