Выбор ответа Senior EXPLAIN и оптимизация обновлено

Перекошенная колонка и неверные оценки

Вопрос

В колонке tenant_id 50 тысяч значений, но у десятка крупных клиентов по миллиону строк. Планировщик ошибается в оценках для средних клиентов. Что поможет точечно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: ALTER COLUMN tenantid SET STATISTICS 1000 и ANALYZE. ANALYZE берёт выборку строк и сохраняет список самых частых значений и гистограмму, их размер задаёт defaultstatisticstarget (по умолчанию 100).

Варианты ответа

  1. VACUUM FULL таблицы, чтобы пересчитать распределение значений
  2. ALTER COLUMN tenant_id SET STATISTICS 1000 и ANALYZEправильный ответ
  3. Создать индекс по tenant_id: он хранит точное число строк значения
  4. Уменьшить 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 ошибок.

Термины по теме