SQL Academy · Урок

ANALYZE и pg_statistic

Поддерживайте статистику планировщика в актуальном состоянии с помощью ANALYZE, изучайте pg_statistic и используйте расширенную статистику для коррелированных столбцов

Урок 3 из 413 шагов

«ANALYZE и pg_statistic» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Зачем нужен ANALYZE?

Планировщику запросов нужно оценивать количество строк и избирательность условий, чтобы выбрать хороший план. Эти оценки строятся на статистике по отдельным столбцам, которую собирает ANALYZE.

Когда запускать ANALYZE

Автовакуум автоматически запускает ANALYZE при достижении порогов изменения числа строк. После массовой загрузки или крупных операций DELETE запускайте его вручную, чтобы планы не ухудшались:

ANALYZE orders;
ANALYZE (VERBOSE) orders;

Выборка

ANALYZE выбирает для каждого столбца несколько сотен строк. Измените целевое значение статистики, если значения по умолчанию дают неточные оценки:

ALTER TABLE orders ALTER COLUMN customer_id SET STATISTICS 1000;
-- Up from default 100. ANALYZE will sample more rows.

pg_statistic

Системный каталог, в котором хранится статистика (для удобства чтения используйте представление pg_stats):

SELECT attname, n_distinct, most_common_vals, most_common_freqs, histogram_bounds
FROM pg_stats
WHERE schemaname = 'public' AND tablename = 'orders';

На что смотрит планировщик

  • n_distinct — количество различных значений
  • most_common_vals — наиболее частые значения и их частота
  • histogram_bounds — интервалы для запросов по диапазону
  • correlation — физический и логический порядок (влияет на стоимость сканирования)

Расширенная статистика

Статистика отдельных столбцов не учитывает взаимосвязи между столбцами. CREATE STATISTICS сохраняет такие взаимосвязи:

CREATE STATISTICS orders_country_status (dependencies)
  ON country, status FROM orders;
ANALYZE orders;

-- Now the planner knows that  country='US' AND status='paid' is correlated
-- (e.g. most US orders happen to be 'paid').

Виды многомерной статистики

  • dependencies — функциональные зависимости (один столбец предсказывает другой)
  • ndistinct — комбинации различных значений
  • mcv — наиболее частые составные значения (в PG 12 и более новых версиях)

Неточные оценки → плохие планы

Самая распространённая причина вопроса «почему мой запрос медленный» — неточная оценка количества строк. Планировщик выбирает вложенный цикл, ожидая 1 строку, тогда как на самом деле их 1 000 000.

EXPLAIN ANALYZE SELECT * FROM ... ;
-- Look at Plan rows vs actual rows. Big gap = run ANALYZE or add extended stats.

Принудительный ANALYZE в миграциях

После большой массовой загрузки:

COPY users FROM ... ;
ANALYZE users;
-- Without ANALYZE, the planner has no idea the table just grew.

Статистика не обновляется автоматически при изменении распределения данных

Если данные за сегодня сильно отличаются от вчерашних, статистика может оставаться устаревшей, пока не сработает автоматический анализ. Выполняйте ANALYZE вручную после изменения структуры данных.

pg_class.reltuples

Планировщик также использует оценочное количество строк из pg_class. Это значение обновляют VACUUM и ANALYZE. Быстро проверить его можно так:

SELECT relname, reltuples FROM pg_class WHERE relname = 'orders';

Итоги

ANALYZE предоставляет данные планировщику.

  • Запускайте его после крупных изменений данных
  • Увеличивайте целевое значение STATISTICS для столбцов с неравномерным распределением
  • Используйте CREATE STATISTICS для взаимосвязей между столбцами
  • Большой разрыв между оценочным и фактическим значением — первое, что нужно исправить

Быстрая проверка

План выполнения с ANALYZE показывает оценочное значение rows=1, но фактическое значение rows=500 000 для условия WHERE по одному столбцу. Какое исправление нужно попробовать первым?

Можно начать бесплатно

Изучай SQL с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
46
Уроки
183

Часто задаваемые вопросы

Урок «ANALYZE и pg_statistic» бесплатный?

Да — полный текст урока «ANALYZE и pg_statistic» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «ANALYZE и pg_statistic»?

Поддерживайте статистику планировщика в актуальном состоянии с помощью ANALYZE, изучайте pg_statistic и используйте расширенную статистику для коррелированных столбцов Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «ANALYZE и pg_statistic»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. MVCC и причины раздувания
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE и pg_statistic
  4. Сканирование только по индексу и карта видимости
← Назад к SQL Academy