Машинное отделение · курс №4 линейки

Открыто 10 глав

Первый урок: Отчёт, который завис

0/49
уроков пройдено
0· +10 за урок
Начать бесплатно

Интерактивный курс · SQL Performance

Твой запрос идёт 40 секунд.
Внизу видно почему.

Не «продвинутый SQL», а машинное отделение запроса: EXPLAIN ANALYZE, сканы и индексы, три алгоритма JOIN, статистика планировщика, сброс сортировок на диск. Каждая задача — на базе в десять миллионов строк, с бюджетом времени и живым планом: не «получи правильный ответ», а «уложись в 500 миллисекунд».

  • живой EXPLAIN ANALYZE в уроке
  • база: 10 000 000 строк
  • зачёт по плану и времени
postgresql · explain Run
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders WHERE user_id = 4171
Seq Scan on orders  (cost=0.00..214801)
  rows=10 000 000 · Execution: 8 412 ms
чертёж запросагде горит → Seq Scan
Формат задачибюджет: 500 мс

Тот же запрос, другой план

10
глав в программе
49/49
уроков уже открыто
10M
строк в учебной базе
≤500 ms
бюджет боевой задачи

Предложение

Симптомы, которые ты уже видел

Шесть ситуаций с работы — и диагноз, который ставит курс. Каждой посвящена глава с живыми планами: не пересказ документации, а разбор на базе, где медленно по-настоящему.

Индекс есть, а в плане — Seq Scan
Функция на колонке — и индекс молчит
Четыре классические причины молчания индекса — и глава, которая учит видеть их в плане
На тесте летало. На проде — 40 секунд
На 10 млн строк живут другие планы
Каждая задача курса идёт на базе в десять миллионов строк — медленно здесь по-настоящему
Добавил LIMIT 10 — стало медленнее
Планировщик поверил не той статистике
Оценка против факта: est rows / actual rows — главная пара чисел в EXPLAIN ANALYZE
OFFSET 100000 всё дольше с каждой страницей
OFFSET читает всё, что ты пролистал
Лечение — keyset-пагинация: она читает только нужную страницу. Глава 8
Запрос внезапно стал в 10 раз медленнее
Сортировка не влезла в work_mem
Sort Method: external merge — строка плана, после которой время вырастает на порядок
ORM написал этот запрос сам
N+1: тысяча запросов вместо одного
Курс читает то, что порождает ORM, — и переписывает это руками

Три сцены

Что видно, когда открываешь машину

Три механизма, которые решают судьбу запроса. Ниже — то же самое, но нарисованное: маршрут до строк, три способа состыковать таблицы и отсек памяти, из которого сортировка утекает на диск.

Главы 2–4

Маршрут решает всё

Один и тот же WHERE может прочитать всю таблицу — или сорок строк из десяти миллионов. Курс учит видеть маршрут в плане и строить индексы, по которым он пойдёт.

Глава 5

Три способа состыковать

JOIN — это не одна операция, а три алгоритма с разными характерами. Планировщик выбирает сам, но по твоим данным — и в плане видно, когда он выбрал не то.

Глава 6

Память кончается молча

Сортировка, которой не хватило work_mem, не падает — она уходит на диск и становится в десять раз медленнее. Одна строка в плане выдаёт это всегда.

Как это устроено

Курс, в котором секунды настоящие

Таких задач нет ни на одной платформе — мы проверили: тренажёры проверяют правильность ответа, а не скорость. Здесь скорость и есть задача.

Медленно по-настоящему

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

Зачёт по плану, а не по тексту

Платформа читает твой план: исчез ли Seq Scan, встал ли индекс, уложилось ли время в бюджет. Списать нельзя — у списанного запроса тот же медленный план.

Сам — потом мастер

После зачёта открывается эталон: план рядом с твоим, узел за узлом. Видно не только «как правильно», но и чем твоё решение отличалось — и на сколько миллисекунд.

Хранилище-9 · нижние палубы

Станция начала отвечать медленно

Утренний отчёт жизнеобеспечения, который собирался мгновенно, сегодня шёл сорок секунд — и завтра будет хуже: архив разросся до десяти миллионов записей. КВЕРИ впервые открывает люк на нижние палубы — туда, где запросы превращаются в маршруты по данным. Там стоит машина, которая решает, каким путём пойдёт каждый твой запрос. Ты научишься читать её чертежи — и чинить их.

  • 01отчёт, который шёл сорок секунд
  • 03каталог из миллиона карточек
  • 06сортировка, не влезшая в отсек
  • 07карта неба трёхлетней давности
  • 09красная зона: бюджет 500 мс

Маршрут

Пять палуб машинного отделения

Программа построена как спуск: сначала учишься читать чертёж, потом разбираешь каталог и механизмы, потом — карту, по которой машина строит маршруты. И выходишь на полный ход.

I

Чертёж

Как машина читает запрос — и где в плане горит

II

Каталог

Индексы: как они работают и почему молчат

III

Механизмы

Джойны, сортировки и память исполнителя

IV

Штурманская рубка

Статистика: почему планировщик ошибается

V

Полный ход

Боевые паттерны, хирургия запросов — и красная зона

Программа

Десять глав нижних палуб

Программа спроектирована по разрывам рынка: мы разобрали программы курсов, книги и требования вакансий — и собрали то, чего не даёт никто. Главы наполняются волнами, как это было с BigQuery.

I

Чертёж

2 главы · 11 уроков

Как машина читает запрос — и где в плане горит

Глава 1бесплатнооткрыта

Сорок секунд: первый EXPLAIN ANALYZE

Увидишь, что происходит с запросом после Enter: парсер, планировщик, исполнитель. Прочитаешь первый план, разберёшь цифры cost, найдёшь узел, который съедает всё время, — и сверишь оценку планировщика с фактом. На этом навыке стоит весь курс.

EXPLAIN ANALYZEBUFFERSest vs actual
6 уроков · 1 ч 11 минартефакт: карта чтения плана
Глава 2 PROоткрыта

Маршруты по данным: четыре вида скана

Разберёшь четыре способа добраться до строк: Seq Scan, Index Scan, Index Only Scan и Bitmap Scan — и когда каждый выигрывает. Узнаешь, почему на маленькой таблице полный проход честно быстрее, откуда в плане берутся Gather и workers — и почему Index Only Scan умирает после массовых UPDATE.

Seq ScanIndex Only ScanGather / workers
5 уроков · 1 ч 7 мин
II

Каталог

2 главы · 10 уроков

Индексы: как они работают и почему молчат

Глава 3 PROоткрыта

Картотека индексов

Разберёшь B-tree изнутри и научишься проектировать индексы: порядок колонок в составном, покрывающие INCLUDE, частичные и функциональные. И честную цену каждого — штраф за запись, раздувание, лишние индексы, которые пора удалить.

B-treeпорядок колонокINCLUDE / partial
5 уроков · 1 ч 5 минартефакт: конструктор индексов
Глава 4 PROоткрыта

Индекс есть, а счастья нет

Самый частый вопрос на собеседованиях: почему индекс не используется. Функция на колонке, тихое приведение типов, LIKE с процентом слева, OR — каждую причину увидишь в плане и починишь руками. Плюс GIN и pg_trgm там, где B-tree бессилен.

sargabilityLIKE '%…'GIN / pg_trgm
5 уроков · 1 ч 7 минартефакт: карточка «4 причины молчания индекса»
III

Механизмы

2 главы · 8 уроков

Джойны, сортировки и память исполнителя

Глава 5 PROоткрыта

Три стыковки: алгоритмы JOIN

Разберёшь три алгоритма JOIN — Nested Loop, Hash Join, Merge Join: почему планировщик выбирает каждый и как увидеть в плане, что он ошибся. Кардинальность соединения, EXISTS вместо DISTINCT-«лечилки», ловушка NOT IN с NULL.

Nested Loop / Hash / MergeEXISTS vs DISTINCTNOT IN и NULL
4 урока · 53 мин
Глава 6 PROоткрыта

Оперативный отсек: память и work_mem

Узнаешь, где запросу не хватает памяти: work_mem выделяется на операцию, а не на запрос, и всё, что не влезло, — сортировки, хэши, битмапы — уходит на диск. Научишься убирать «Disk:» из плана и получать сортировку от индекса даром.

work_memexternal mergeHash Batches
4 урока · 52 мин
IV

Штурманская рубка

1 глава · 5 уроков

Статистика: почему планировщик ошибается

Глава 7 PROоткрыта

Устаревшая карта неба: статистика планировщика

Спустишься к статистике — данным о данных, по которым машина строит маршрут: оценка против факта, ANALYZE после массовых загрузок, корреляция колонок и CREATE STATISTICS, ловушка ORDER BY + LIMIT, generic- против custom-планов. Тому, что в этой главе, не учит ни один курс.

est vs actualCREATE STATISTICSловушка LIMIT
5 уроков · 1 ч 7 мин
V

Полный ход

3 главы · 15 уроков

Боевые паттерны, хирургия запросов — и красная зона

Глава 8 PROоткрыта

Тысяча мелких рейсов: N+1 и пагинация

Приёмы из кода приложения, которыми чаще всего убивают базу: N+1 из ORM — сто один запрос из лога превращается в один; OFFSET-пагинация, читающая всё пролистанное, и keyset-пагинация вместо неё; COUNT(*) на MVCC и цена широких строк — SELECT *, TOAST и JSONB.

N+1OFFSET vs keysetCOUNT(*)
5 уроков · 1 ч 7 мин
Глава 9 PROоткрыта

Медленно → быстро

Хирургия запроса: коррелированный подзапрос, который выполняется заново для каждой строки, CTE-барьер и MATERIALIZED, «последняя запись в группе» тремя способами, окна против GROUP BY — с контрпримерами в обе стороны. Результат обязан совпасть, план — стать лучше.

LATERALCTE / MATERIALIZEDDISTINCT ON
5 уроков · 1 ч 8 минартефакт: каталог переписываний с контрпримерами
Глава 10 PROоткрыта

Красная зона: инцидент и экзамен

Финальный инцидент: прод просел в пятницу — улики в pg_stat_statements, wait events и пачке планов. Развилка «медленный или ждущий»: блокировки, которых EXPLAIN не покажет. Потом марафон задач с бюджетом времени и растущими ограничениями: сначала можно всё, потом только индексы, потом только запрос. После зачёта — разбор от мастера: эталонный план рядом с твоим.

pg_stat_statementsбюджет ≤ 500 мссертификат
5 уроков · 1 ч 7 минартефакт: лицензия инженера

Что останется

Не только пройденные главы

Воркфлоу диагностики

Пошаговый маршрут «медленный запрос → EXPLAIN ANALYZE → узел с максимальным временем → оценка против факта → починка». Методика, которую вакансии называют «умением профилировать».

Чек-листы инженера

«Почему индекс молчит» — четыре причины с проверками. «Признаки боли в плане» — от external merge до est/actual в тысячу раз. Их держат под рукой годами.

Экзамен и сертификат

Красная зона: серия задач с бюджетом времени на общей базе в десять миллионов строк. Ограничения растут от задачи к задаче. Зачёт — именной сертификат инженера.

Люк открыт. Спускайся.

Первая глава открыта и бесплатна: живой EXPLAIN прямо в уроке, ничего не нужно ставить. Следующие главы выходят волнами.

Средний урок — 12 минут