# Селективность и точка перелома _Планировщик и оптимизатор · PostgreSQL Knowledge Base_ **TL;DR:** Селективность - доля строк, проходящих условие. Index Scan дёшев при малой доле и круто дорожает; Seq Scan стоит одинаково. Линии пересекаются на единицах процентов - это точка перелома, зависит от random_page_cost. Селективность определяет, какой метод доступа выгоднее (см. [access-methods](/courses/postgres/kb/access-methods.md)). ## Что такое селективность Это доля строк таблицы, удовлетворяющих условию. `flight_id = 7` может иметь селективность 0.2% (мало строк), `departure = 'SVO'` - 80% (много). Планировщик выводит её из статистики (см. [planner-statistics](/courses/postgres/kb/planner-statistics.md)) и умножает на число строк, получая оценку `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) - индексный доступ станет дешевле, и перелом сдвинется вправо: индекс будет выбираться на большей доле строк. ```sql EXPLAIN SELECT * FROM big WHERE k = 7; -- мало строк → Index/Bitmap EXPLAIN SELECT * FROM big WHERE k < 900; -- много строк → Seq Scan ``` ## Команды ```sql EXPLAIN SELECT * FROM t WHERE col = 'rare'; ``` Узкое условие - ожидается индексный доступ ```sql SET random_page_cost = 1.1; ``` Сдвинуть точку перелома вправо (индекс выгоден на большей доле) ## См. также - [Методы доступа: Seq, Index, Bitmap, Index-Only](/courses/postgres/kb/access-methods.md) - [Стоимостная модель](/courses/postgres/kb/cost-model.md) - [Статистика планировщика: pg_stats](/courses/postgres/kb/planner-statistics.md)