Перекошенная колонка и неверные оценки
Вопрос
В колонке tenant_id 50 тысяч значений, но у десятка крупных клиентов по миллиону строк. Планировщик ошибается в оценках для средних клиентов. Что поможет точечно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
VACUUM FULLтаблицы, чтобы пересчитать распределение значенийALTER COLUMN tenant_id SET STATISTICS 1000иANALYZEправильный ответ- Создать индекс по
tenant_id: он хранит точное число строк значения - Уменьшить
random_page_costдо 0, чтобы оценки стали точнее
Разбор
ANALYZE берёт выборку строк и сохраняет список самых частых значений и гистограмму, их размер задаёт default_statistics_target (по умолчанию 100). Для сильно перекошенной колонки с большим числом значений сотни элементов мало, и редкие и средние значения оцениваются грубо. Точечно увеличивают target для одной колонки (ALTER TABLE ... ALTER COLUMN tenant_id SET STATISTICS 1000, максимум 10 000) и запускают ANALYZE. Индексы точных количеств не хранят, VACUUM FULL статистику не уточняет, а random_page_cost меняет стоимость чтения, но не оценки строк.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Подготовленный запрос внезапно стал медленным
Следующий вопрос
work_mem = 1GB и падение базы по памяти