В EXPLAIN вы видите оценку rows=10, но по смыслу запроса ожидаете тысячи строк. Какое объяснение и следующий шаг наиболее разумны?
AЭто может быть ошибка оценок (статистика/распределение данных), из‑за чего план может быть неоптимальным; стоит проверить реальную кардинальность (например, через
EXPLAIN ANALYZE) и при необходимости обновить статистику (ANALYZE) или уточнить фильтр.BСкорее всего, статистика корректна, а оценка
rows=10 означает, что индекс слишком селективен; нужно добавить составной индекс на колонки фильтра и перезапустить запрос без изменений.CВероятно,
JOIN отфильтровал лишние строки из-за несовпадения типов; следует привести типы ключей JOIN к одному типу и затем проверить план через EXPLAIN повторно.DСкорее всего,
rows отражает количество строк после применения LIMIT; нужно убрать LIMIT из запроса, чтобы планировщик показал реальный объём данных.Правильный ответ. Сильные расхождения в
rows — повод подозревать неверные оценки и возможный плохой план.Разбор
rows в EXPLAIN — это прогноз планировщика. Если он сильно не совпадает с реальностью, оптимизатор может выбрать неправильный тип скана или порядок соединений. Для аналитика полезно: (1) подтвердить факт через EXPLAIN ANALYZE на безопасном окружении и (2) договориться об обновлении статистики (ANALYZE) или переписать условия так, чтобы оценки стали точнее.
Проверь себя · 1/3разбор после ответа
Вы хотите добавить новый запрос в дашборд и боитесь, что он сильно нагрузит базу, потому что таблица
events очень большая. Что дает запуск EXPLAIN для этого запроса?Ещё вопросы по теме «EXPLAIN и оптимизация»
- Вы хотите добавить новый запрос в дашборд и боитесь, что он сильно нагрузит базу, потому что таблица `events` очень большая. Что дает запуск `EXPLAIN` для этого запроса?
- В выводе `EXPLAIN` вы видите узел `Seq Scan on orders`. Что это обычно означает?
- В плане `EXPLAIN` для запроса по пользователю вы видите `Index Scan using orders_user_id_idx on orders`. Какой вывод наиболее корректен?
- На большой таблице `events` запрос `SELECT * FROM events ORDER BY created_at DESC LIMIT 100` неожиданно работает быстро. Какое объяснение наиболее вероятно при наличии индекса по `created_at`?
- Есть индекс по `orders.created_at`, но `EXPLAIN` для фильтра `WHERE date(created_at) = current_date` показывает `Seq Scan`. Почему это часто происходит?
- Все вопросы по «EXPLAIN и оптимизация» →