В EXPLAIN вы видите оценку rows=10, но по смыслу запроса ожидаете тысячи строк. Какое объяснение и следующий шаг наиболее разумны?
AВозможна ошибка оценок из-за устаревшей статистики; стоит проверить реальную кардинальность через
EXPLAIN ANALYZE и обновить статистику командой ANALYZEBСтатистика корректна, оценка
rows=10 означает слишком селективный индекс; нужно добавить составной индекс на колонки фильтра и перезапустить запросC
JOIN отфильтровал лишние строки из-за несовпадения типов; следует привести типы ключей к одному и проверить план через EXPLAIN повторноD
rows отражает количество строк после применения LIMIT; нужно убрать LIMIT из запроса, чтобы планировщик показал реальный объём данныхПравильный ответ. Сильные расхождения в
rows — повод подозревать неверные оценки и возможный плохой план.Разбор
rows в EXPLAIN — это прогноз планировщика. Если он сильно не совпадает с реальностью, оптимизатор может выбрать неправильный тип скана или порядок соединений. Для аналитика полезно: (1) подтвердить факт через EXPLAIN ANALYZE на безопасном окружении и (2) договориться об обновлении статистики (ANALYZE) или переписать условия так, чтобы оценки стали точнее.
Проверь себя · 1/3разбор после ответа
Как удобнее интерпретировать дерево
EXPLAIN, чтобы понять, откуда берутся строки и где тратятся ресурсы запроса?Ещё вопросы по теме «EXPLAIN и оптимизация»
- Вы хотите добавить новый запрос в дашборд и боитесь, что он сильно нагрузит базу, потому что таблица `events` очень большая. Что даёт запуск `EXPLAIN` для этого запроса?
- В выводе `EXPLAIN` вы видите узел `Seq Scan on orders`. Что это обычно означает в плане выполнения запроса?
- В плане `EXPLAIN` для запроса по пользователю вы видите проход по индексу `orders_user_id_idx` для таблицы заказов. Какой вывод наиболее корректен?
- На большой таблице `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 и оптимизация» →