Открыто 10 глав
Первый урок: Отчёт, который завис
Интерактивный курс · SQL Performance
Твой запрос идёт 40 секунд.
Внизу видно почему.
Не «продвинутый SQL», а машинное отделение запроса: EXPLAIN ANALYZE, сканы и индексы, три алгоритма JOIN, статистика планировщика, сброс сортировок на диск. Каждая задача — на базе в десять миллионов строк, с бюджетом времени и живым планом: не «получи правильный ответ», а «уложись в 500 миллисекунд».
- живой EXPLAIN ANALYZE в уроке
- база: 10 000 000 строк
- зачёт по плану и времени
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Тот же запрос, другой план
Предложение
Симптомы, которые ты уже видел
Шесть ситуаций с работы — и диагноз, который ставит курс. Каждой посвящена глава с живыми планами: не пересказ документации, а разбор на базе, где медленно по-настоящему.
Три сцены
Что видно, когда открываешь машину
Три механизма, которые решают судьбу запроса. Ниже — то же самое, но нарисованное: маршрут до строк, три способа состыковать таблицы и отсек памяти, из которого сортировка утекает на диск.
Маршрут решает всё
Один и тот же WHERE может прочитать всю таблицу — или сорок строк из десяти миллионов. Курс учит видеть маршрут в плане и строить индексы, по которым он пойдёт.
Три способа состыковать
JOIN — это не одна операция, а три алгоритма с разными характерами. Планировщик выбирает сам, но по твоим данным — и в плане видно, когда он выбрал не то.
Память кончается молча
Сортировка, которой не хватило work_mem, не падает — она уходит на диск и становится в десять раз медленнее. Одна строка в плане выдаёт это всегда.
Как это устроено
Курс, в котором секунды настоящие
Таких задач нет ни на одной платформе — мы проверили: тренажёры проверяют правильность ответа, а не скорость. Здесь скорость и есть задача.
Медленно по-настоящему
Учебная база — десять миллионов строк, и неудачный запрос в ней действительно ждёшь. Ускорение на порядки — не строчка в конспекте, а то, что происходит у тебя на глазах.
Зачёт по плану, а не по тексту
Платформа читает твой план: исчез ли Seq Scan, встал ли индекс, уложилось ли время в бюджет. Списать нельзя — у списанного запроса тот же медленный план.
Сам — потом мастер
После зачёта открывается эталон: план рядом с твоим, узел за узлом. Видно не только «как правильно», но и чем твоё решение отличалось — и на сколько миллисекунд.
Хранилище-9 · нижние палубы
Станция начала отвечать медленно
Утренний отчёт жизнеобеспечения, который собирался мгновенно, сегодня шёл сорок секунд — и завтра будет хуже: архив разросся до десяти миллионов записей. КВЕРИ впервые открывает люк на нижние палубы — туда, где запросы превращаются в маршруты по данным. Там стоит машина, которая решает, каким путём пойдёт каждый твой запрос. Ты научишься читать её чертежи — и чинить их.
- 01отчёт, который шёл сорок секунд
- 03каталог из миллиона карточек
- 06сортировка, не влезшая в отсек
- 07карта неба трёхлетней давности
- 09красная зона: бюджет 500 мс
Маршрут
Пять палуб машинного отделения
Программа построена как спуск: сначала учишься читать чертёж, потом разбираешь каталог и механизмы, потом — карту, по которой машина строит маршруты. И выходишь на полный ход.
Чертёж
Как машина читает запрос — и где в плане горит
Каталог
Индексы: как они работают и почему молчат
Механизмы
Джойны, сортировки и память исполнителя
Штурманская рубка
Статистика: почему планировщик ошибается
Полный ход
Боевые паттерны, хирургия запросов — и красная зона
Программа
Десять глав нижних палуб
Программа спроектирована по разрывам рынка: мы разобрали программы курсов, книги и требования вакансий — и собрали то, чего не даёт никто. Главы наполняются волнами, как это было с BigQuery.
Чертёж
2 главы · 11 уроковКак машина читает запрос — и где в плане горит
Сорок секунд: первый EXPLAIN ANALYZE
Увидишь, что происходит с запросом после Enter: парсер, планировщик, исполнитель. Прочитаешь первый план, разберёшь цифры cost, найдёшь узел, который съедает всё время, — и сверишь оценку планировщика с фактом. На этом навыке стоит весь курс.
Маршруты по данным: четыре вида скана
Разберёшь четыре способа добраться до строк: Seq Scan, Index Scan, Index Only Scan и Bitmap Scan — и когда каждый выигрывает. Узнаешь, почему на маленькой таблице полный проход честно быстрее, откуда в плане берутся Gather и workers — и почему Index Only Scan умирает после массовых UPDATE.
Каталог
2 главы · 10 уроковИндексы: как они работают и почему молчат
Картотека индексов
Разберёшь B-tree изнутри и научишься проектировать индексы: порядок колонок в составном, покрывающие INCLUDE, частичные и функциональные. И честную цену каждого — штраф за запись, раздувание, лишние индексы, которые пора удалить.
Индекс есть, а счастья нет
Самый частый вопрос на собеседованиях: почему индекс не используется. Функция на колонке, тихое приведение типов, LIKE с процентом слева, OR — каждую причину увидишь в плане и починишь руками. Плюс GIN и pg_trgm там, где B-tree бессилен.
Механизмы
2 главы · 8 уроковДжойны, сортировки и память исполнителя
Три стыковки: алгоритмы JOIN
Разберёшь три алгоритма JOIN — Nested Loop, Hash Join, Merge Join: почему планировщик выбирает каждый и как увидеть в плане, что он ошибся. Кардинальность соединения, EXISTS вместо DISTINCT-«лечилки», ловушка NOT IN с NULL.
Оперативный отсек: память и work_mem
Узнаешь, где запросу не хватает памяти: work_mem выделяется на операцию, а не на запрос, и всё, что не влезло, — сортировки, хэши, битмапы — уходит на диск. Научишься убирать «Disk:» из плана и получать сортировку от индекса даром.
Штурманская рубка
1 глава · 5 уроковСтатистика: почему планировщик ошибается
Устаревшая карта неба: статистика планировщика
Спустишься к статистике — данным о данных, по которым машина строит маршрут: оценка против факта, ANALYZE после массовых загрузок, корреляция колонок и CREATE STATISTICS, ловушка ORDER BY + LIMIT, generic- против custom-планов. Тому, что в этой главе, не учит ни один курс.
Полный ход
3 главы · 15 уроковБоевые паттерны, хирургия запросов — и красная зона
Тысяча мелких рейсов: N+1 и пагинация
Приёмы из кода приложения, которыми чаще всего убивают базу: N+1 из ORM — сто один запрос из лога превращается в один; OFFSET-пагинация, читающая всё пролистанное, и keyset-пагинация вместо неё; COUNT(*) на MVCC и цена широких строк — SELECT *, TOAST и JSONB.
Медленно → быстро
Хирургия запроса: коррелированный подзапрос, который выполняется заново для каждой строки, CTE-барьер и MATERIALIZED, «последняя запись в группе» тремя способами, окна против GROUP BY — с контрпримерами в обе стороны. Результат обязан совпасть, план — стать лучше.
Красная зона: инцидент и экзамен
Финальный инцидент: прод просел в пятницу — улики в pg_stat_statements, wait events и пачке планов. Развилка «медленный или ждущий»: блокировки, которых EXPLAIN не покажет. Потом марафон задач с бюджетом времени и растущими ограничениями: сначала можно всё, потом только индексы, потом только запрос. После зачёта — разбор от мастера: эталонный план рядом с твоим.
Что останется
Не только пройденные главы
Воркфлоу диагностики
Пошаговый маршрут «медленный запрос → EXPLAIN ANALYZE → узел с максимальным временем → оценка против факта → починка». Методика, которую вакансии называют «умением профилировать».
Чек-листы инженера
«Почему индекс молчит» — четыре причины с проверками. «Признаки боли в плане» — от external merge до est/actual в тысячу раз. Их держат под рукой годами.
Экзамен и сертификат
Красная зона: серия задач с бюджетом времени на общей базе в десять миллионов строк. Ограничения растут от задачи к задаче. Зачёт — именной сертификат инженера.
Люк открыт. Спускайся.
Первая глава открыта и бесплатна: живой EXPLAIN прямо в уроке, ничего не нужно ставить. Следующие главы выходят волнами.
Средний урок — 12 минут