awesome-everything EN
↑ Обратно к восхождению

Базы данных

Производственные режимы отказа и стабильность планов

Суть Восемь реальных режимов отказа — устаревшая статистика, ловушка общего плана, коррелированные колонки, неверная настройка SSD, накладные расходы JIT, сброс work_mem, дрейф random_page_cost и перескоки — плюс стратегия обнаружения и предотвращения регрессий планов между деплоями.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 18 min

Dashboard заказов B2B SaaS-продукта деградирует каждое воскресенье утром. Ко вторнику всё в порядке. Паттерн: пакетный импорт запускается в воскресенье ночью, сдвигая распределения данных; autovacuum не успевает запустить ANALYZE к понедельнику; планировщик выбирает Nested Loop с недооценкой соединения в 1000×. ANALYZE в хуке после пакетной обработки навсегда устраняет инцидент.

Восемь реальных производственных режимов отказа

Режим отказаСимптомИсправление
Каскад устаревшей статистикиВнезапное замедление после массовой вставки; rows-estimated резко отличается от actualANALYZE в post-batch хуке; снизить autovacuum_analyze_scale_factor
Ловушка общего планаВысокое stddev_exec_time; бимодальная задержка на подготовленном оператореplan_cache_mode = force_custom_plan для роли
Взрыв коррелированных колонокNested Loop с 1M итераций; rows-estimated ~1000× нижеCREATE STATISTICS (dependencies, mcv); ANALYZE
Неверная настройка random_page_cost (SSD)Планировщик выбирает Seq Scan там, где должен был бы Index Scan; запросы читают целые таблицыSET random_page_cost = 1.1 в postgresql.conf
Накладные расходы JIT на OLTPКороткие запросы медленнее ожидаемого; время компиляции JIT превышает экономию выполненияПоднять jit_above_cost до 500000 или SET jit = off для OLTP-роли
Сброс work_memSort Method: external merge; Hash Batches > 1; медленные запросы при соединениях/сортировкахSET work_mem = ‘32MB’ на сессию; не глобально без проверки бюджета памяти
Слишком малый effective_cache_sizeПланировщик предпочитает Seq Scan даже на SSD с большой RAM, потому что предполагает холодные данныеSET effective_cache_size = ‘24GB’ (~75% общей RAM)
Перескоки плана при смене фазы нагрузкиОдин и тот же запрос получает разные планы в разное время; autovacuum в конце концов восстанавливает балансpg_hint_plan для критических путей; иначе принять вариативность и алертить на неё

Стабильность планов между деплоями

Наиболее распространённая операционная боль: деплой с новыми таблицами, новыми данными или другими объёмами вызывает регрессии планов на неизменённых запросах.

Пятиуровневая стратегия:

Уровень 1 — настройка константных стоимостей (один раз): Установите random_page_cost = 1.1, effective_cache_size в 75% RAM, work_mem = 16-32MB. Проверьте через EXPLAIN на top-20 запросах. Это обеспечивает правильную ментальную модель вашего железа у планировщика.

Уровень 2 — свежесть статистики: Снизьте autovacuum_analyze_scale_factor = 0.02 на горячих таблицах. Добавьте ANALYZE critical_tables в каждый deploy-хук. Создайте объекты CREATE STATISTICS для коррелированных групп колонок, выявленных через EXPLAIN.

Уровень 3 — кеш планов для косых нагрузок: Установите plan_cache_mode = 'force_custom_plan' на ролях, выполняющих параметризованные запросы с косыми распределениями параметров (выявлены через высокое stddev_exec_time).

Уровень 4 — наблюдаемость: Настройте auto_explain (log_min_duration = 500мс, log_analyze = true, log_buffers = true, log_format = json, sample_rate = 0.05). Архивируйте pg_stat_statements еженедельно (reset + сохранить в файл/S3).

Уровень 5 — процедура деплоя: Перед каждым деплоем делайте снимок pg_stat_statements + EXPLAIN top-20 запросов в JSON. После деплоя: ANALYZE критических таблиц, подождать 5 минут, повторный снимок. Diff ключевых метрик. Флажить любой запрос, чья структура плана изменилась или чей mean_exec_time вырос более чем на 50%.

Проследи
1/5

Старший инженер настраивает Postgres 16 OLTP базу данных на NVMe SSD (32 ГБ RAM, 500 ГБ БД, ~5k QPS), задеплоенную с настройками планировщика по умолчанию.

1
Step 1 of 5
Шаг 1: базовая линия.
2
Locked
Шаг 2: настройка стоимостей для SSD.
3
Locked
Шаг 3: обновление и расширение статистики.
4
Locked
Шаг 4: память и JIT.
5
Locked
Шаг 5: наблюдаемость.
Выбери лучший вариант

Команде нужно стабилизировать планы выполнения между деплоями для top-20 OLTP запросов. Выберите стратегию.

Викторина

Пакетное задание вставляет 20M строк в таблицу orders каждое воскресенье ночью. Каждое понедельное утро запросы, быстрые в пятницу, медленные. Ко вторнику снова нормально. Какова корневая причина и исправление?

Викторина

Запрос показывает `Sort Method: external merge Disk: 450MB` в EXPLAIN ANALYZE. Каковы интерпретация и исправление?

Вспомните перед уходом
  1. 01
    Объясните, почему разрыв между rows-estimated и rows-actual на каждом узле плана является единственным наиболее важным диагностическим показателем в Postgres.
  2. 02
    Спроектируйте стратегию стабильности планов для B2B SaaS Postgres 16 базы данных на NVMe SSD (32 ГБ RAM, 500 ГБ БД, 5k OLTP QPS). Top-20 запросов выявлены через pg_stat_statements. 3 из 20 — тяжёлые агрегации.
Итог

Восемь производственных режимов отказа покрывают большинство регрессий планов Postgres: устаревшая статистика после массовых операций (ANALYZE в post-batch хуке), ловушка общего плана на подготовленных операторах с косыми параметрами (plan_cache_mode = force_custom_plan), ошибки оценки строк для коррелированных колонок (CREATE STATISTICS dependencies + mcv), неверная настройка SSD (random_page_cost = 1.1), накладные расходы JIT на OLTP (поднять jit_above_cost), сброс work_mem (сортировка/хеш сбрасываются на диск — исправить per-session), несоответствие effective_cache_size и перескоки планов при смене фазы данных. Операционная стратегия имеет пять уровней: откалиброванные под SSD константные стоимости, агрессивное обслуживание статистики, избирательные переопределения plan_cache_mode, наблюдаемость auto_explain + pg_stat_statements и процедура деплоя, сравнивающая планы и метрики до и после каждого деплоя. Используйте pg_hint_plan только для 1-3 запросов, где план должен быть закреплён и правильная форма плана постоянно известна; давайте планировщику адаптироваться ко всему остальному.

Практика

Сделай это, чтобы превратить узнавание в навык.

Связанные уроки
встречается в258
Продолжить восхождение ↑Планы выполнения: тест с выбором ответа
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.