SQLLab
Справочник/Индексы/Seq Scan / Index Scan
ИндексыСредний

Seq Scan / Index Scan

Seq Scan — полное сканирование таблицы. Index Scan — поиск через индекс. EXPLAIN показывает какой метод выбран.

Синтаксис
EXPLAIN SELECT * FROM table WHERE col = value;

Объяснение

Три основных метода доступа к данным: Seq Scan: читает все страницы таблицы последовательно. Эффективен для маленьких таблиц или когда нужно читать большую часть строк. Index Scan: находит строки через индекс, затем читает нужные страницы. Эффективен для малой выборки. Bitmap Index Scan: собирает битмап нужных страниц через индекс, затем читает их по порядку. Промежуточный вариант.

Пример

-- Seq Scan (без индекса или маленькая таблица)
EXPLAIN SELECT * FROM users WHERE country = 'RU';
-- -> Seq Scan on users  (cost=0.00..1850.00 rows=12000 ...)

-- Index Scan (с индексом)
CREATE INDEX ON users (country);
EXPLAIN SELECT * FROM users WHERE country = 'RU';
-- -> Index Scan using users_country_idx ...)

Анекдоты по теме

— Почему UUID медленнее INT как первичный ключ? — UUID случайный — вставки разбросаны по всему индексу. — INT последовательный — всегда в конец. — Насколько медленнее? — На больших таблицах B-tree страницы постоянно разбиваются. В разы медленнее INSERT. — Решение? — UUID v7 (упорядоченный по времени) или ULID — случайные, но монотонные.

— Что такое seq_page_cost и random_page_cost? — Параметры PostgreSQL для оценки стоимости I/O. — По умолчанию random_page_cost = 4.0 (в 4 раза дороже seq). — На SSD? — Лучше поставить 1.1–1.5. Оптимизатор будет чаще использовать индексы. — Это действительно меняет планы? — Значительно.

Оптимизатор запросов говорит медленному подзапросу: — Ты почему такой тормоз? Подзапрос (ковыряя IN (SELECT ...)): — Я каждую строчку с каждой сравниваю. Зато честно. Оптимизатор: — Используй EXISTS. Подзапрос, помолчав: — Так я не знаю, существую ли я на самом деле после этого...