Базы данных
Планы выполнения: тест с выбором ответа
Шесть вопросов, проходящих через весь юнит. Каждый — план, который ты реально читал бы в инциденте: не определение для пересказа, а диагноз, который нужно поставить по выводу, и фикс, который нужно выбрать под нагрузкой.
Подтверди, что умеешь читать план EXPLAIN ANALYZE, проследить плохую оценку строк вверх до join, который она сломала, и выбрать фикс, бьющий по причине, а не по симптому — синтез, к которому вели семь уроков.
Запрос быстр на staging и медленный в production. Та же схема, те же индексы. EXPLAIN ANALYZE прод-прогона показывает: Nested Loop (actual time=4180..4192 rows=50 loops=1) -> Index Scan on orders (cost=0..3800000 rows=50) (actual time=12..3950 rows=520000 loops=1) -> Index Scan on customers_pkey (actual time=0.002..0.002 rows=1 loops=520000) В чём первопричина?
Таблица на 1M строк имеет индекс по status. Запрос WHERE status = 'active' попадает в 400 000 строк (40% таблицы). Планировщик выбирает Seq Scan вместо индекса. Это баг, и почему?
Предикат фильтрует по WHERE country='US' AND region='CA' AND status='shipped'. Планировщик прогнозирует 500 строк; узел реально выдаёт 50 000. Одноколоночная statistics свежая. Что чинит оценку?
Параметризованный запрос быстр месяцами, затем P99 прыгает до 4с, а среднее остаётся ~3мс. pg_stat_statements показывает большой stddev_exec_time. EXPLAIN (GENERIC_PLAN) по подготовленной форме показывает: Index Scan using idx_orders_created on orders Filter: ((workspace_id = $1) AND (status = $2)) Что произошло и каков немедленный фикс?
B2B-дашборд деградирует каждое утро понедельника после ночного воскресного batch-импорта 20M строк, затем сам восстанавливается ко вторнику. В чём причина и устойчивый фикс?
EXPLAIN (ANALYZE, BUFFERS) на Hash Join показывает Hash Batches: 64 и Sort Method: external merge Disk: 450MB на сортировке под ним. Среднее время высокое, но reads — в основном shared hit. В чём узкое место и точечный фикс?
Сквозная линия юнита — одна дисциплина чтения: на каждом узле плана сравнивай rows-estimated с actual rows, найди, где открывается разрыв, и проследи его вверх — плохая оценка каскадирует в неверный выбор scan, неверный алгоритм join и неверный метод сортировки над ней. Выбор scan следует за селективностью, выбор join — за оценкой внешней стороны, а устойчивые фиксы бьют по причине: свежая statistics через ANALYZE, extended statistics для коррелированных колонок, force_custom_plan для перекошенных prepared statements и cost-константы под SSD. Форсирование алгоритма или перестройка индекса лечат симптом; починка оценки исправляет весь план.