Seq Scan / Index Scan
Seq Scan — полное сканирование таблицы. Index Scan — поиск через индекс. EXPLAIN показывает какой метод выбран.
EXPLAIN SELECT * FROM table WHERE col = value;Объяснение
Пример
-- 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. Подзапрос, помолчав: — Так я не знаю, существую ли я на самом деле после этого...