После массовой загрузки данных запросы, работавшие быстро, резко замедлились, хотя индексы на месте. Наиболее вероятная причина?
- Почему после загрузки данных запросы стали медленными?
Планировщик стоимостный: он опирается на статистику (число строк, распределение значений). После массовой загрузки она устарела — оценки неверны, выбирается плохой план.
- Лечение:
ANALYZE таблицапосле больших загрузок - Autovacuum обновит статистику позже, но не сразу
- Признак в EXPLAIN ANALYZE: оценка rows сильно отличается от фактической
А ещё Для коррелированных колонок — расширенная статистика (CREATE STATISTICS)
Подробно
Оценка числа строк определяет выбор способа соединения и доступа. Если статистика говорит о тысяче строк, а их стало десять миллионов, планировщик выберет вложенные циклы там, где нужно хеш-соединение, и запрос замедлится на порядки. Автоматический сбор статистики обычно есть, но он срабатывает по порогу и с задержкой — после массовой загрузки её собирают явно. Смежные причины того же класса: раздувание таблицы из-за накопившихся мёртвых версий строк и индексы, которые полезно перестроить после большой загрузки. Диагностика одна и та же — сравнить в фактическом плане оценку и реальность.
Что хотят услышать
- Роль статистики в выборе плана.
- ANALYZE как исправление.
- Как увидеть проблему в плане.
Частые ошибки
- Начинать с добавления индексов, не посмотрев план.
- Забывать про статистику после массовых операций и миграций.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Превышен лимит соединений к базе
- ✗Индексы при массовой вставке временно отключаются и включатся только после перезапуска СУБД
- ✗Таблица стала слишком большой для любого индекса
- ✓Устарела статистика, и планировщик ошибается в оценках — нужен её пересбор
Что спросят дальше
- Как автоматический сбор статистики решает, когда сработать?
- Что такое раздувание таблицы и почему оно замедляет чтение?
Разбор темы
- Практика оптимизации запросов
EXPLAIN и чтение плана, порядок колонок индекса, keyset-пагинация и ловушки, мешающие индексу.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.