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 ...)
Связанные термины
Анекдоты по теме
— Что такое index bloat? — Индекс «раздувается» со временем из-за мёртвых версий строк. — Как проверить? — pgstattuple расширение: SELECT * FROM pgstatindex('idx_name'); — Как исправить? — REINDEX CONCURRENTLY idx_name; — перестраивает без блокировки. — VACUUM не помогает? — Помогает частично. Тяжёлый bloat — REINDEX.
— Почему оптимизатор иногда выбирает плохой план? — Устаревшая статистика. Запусти ANALYZE. — Или: очень нетипичное распределение данных. — Или: коррелированные условия WHERE — оптимизатор считает их независимыми. — Решение? — CREATE STATISTICS ON (a, b) FROM table; — многоколоночная статистика.
— Мой запрос работает 10 секунд. Как ускорить? — Покажи EXPLAIN ANALYZE. — Вот: Seq Scan, cost=0..999999. — Индекс. — Уже 0.5 секунды. — Теперь смотри на остальные узлы.