Когда БД может использовать SEQUENTIAL SCAN вместо индекса
Python
Senior
Okko
Когда БД может использовать SEQUENTIAL SCAN вместо индекса
Ответы
В PostgreSQL (и других СУБД) sequential scan может быть выбран вместо индекса в нескольких случаях:
- **Большой процент данных**: Если запрос затрагивает >5-10% таблицы, оптимизатор может решить, что полное сканирование эффективнее.
- **Отсутствие подходящего индекса**: Нет индекса для условий WHERE или JOIN.
- **Неселективные запросы**: `WHERE status = 'active'` (если 90% строк имеют этот статус).
- **Маленькие таблицы**: Для таблиц, помещающихся в 1-2 страницы, seq scan дешевле.
- **Принудительное отключение**: `SET enable_indexscan = off;`
Пример:
```
-- Создадим таблицу и индекс
CREATE TABLE users (id serial, name text, is_active bool);
CREATE INDEX idx_active ON users(is_active);
INSERT INTO users (name, is_active)
SELECT 'user_'||n, n%10=0 FROM generate_series(1,100000) n;
-- Seq scan, т.к. 90% строк неактивны
EXPLAIN ANALYZE SELECT * FROM users WHERE NOT is_active;
```