$ cat /intro
Это учебник по PostgreSQL.
Сначала модель, потом SQL.
Материалы про Postgres обычно делятся на два жанра: SQL-туториалы учат языку, но не системе, а admin-cookbook'и дают рецепты без модели - работает, пока не сломается. Этот учебник занимает нишу между ними: как Postgres устроен внутри.
Процессы и память, страница на диске, кортеж и его системные поля, MVCC, WAL и восстановление, планировщик, индексы, блокировки, репликация. Сначала модель - страница, кортеж, снимок, - потом SQL и эксплуатация, которые из этой модели выводятся.
Отличие от книг Рогова и Suzuki - интерактивность. Не «прочитай про страницу», а открой её через pageinspect и найди в ней свою строку. Postgres - это не чёрный ящик, а процессы, файлы и журнал, которые можно потрогать.
Кому подойдёт
Пререквизит - Linux-база портфеля: процессы и fork, память и page cache, файловая система, fsync. SQL на уровне SELECT и UPDATE - тоже пригодится.
- Backend-разработчик
- Уверенно пишешь SQL, но не знаешь, что такое `xmin`, почему `UPDATE` плодит мёртвые версии строк и зачем вообще нужен `VACUUM`. Книга достраивает модель под язык, на котором ты уже говоришь.
- SRE и DevOps
- Держишь Postgres в проде и тушишь инциденты: кончились transaction id, раздулась таблица, отстала реплика. Хочешь понимать причину, а не гуглить симптом по тексту ошибки.
- Начинающий DBA
- Нужна не зубрёжка параметров, а модель, из которой они выводятся. `shared_buffers` и autovacuum перестают быть магией, когда видишь, на что именно они влияют.
- Любопытный системщик
- Прошёл Linux-учебник и хочешь увидеть, как `fsync`, page cache и процессная модель работают в настоящей СУБД. Postgres - естественный капстоун системных знаний.
Терминал - незнакомая среда? Начни с LinuxLab: процессы, память и файловая система там разобраны с нуля, и Postgres пойдёт легче.
Почему именно так
Три принципа, на которых держится книга. Если звучат разумно - читаем дальше. Если нет - возможно, тебе нужен справочник команд, а не учебник.
- Сначала модель
- Большинство материалов начинают с `SELECT … JOIN` или с готовых настроек. Здесь наоборот: сперва страница на диске, кортеж и снимок, и только потом запросы. Когда видишь, где физически лежит строка, MVCC и vacuum перестают быть заклинаниями.
- Щупать, а не верить на слово
- Каждая глава опирается на эфемерный sandbox с настоящим PostgreSQL. Не «WAL обеспечивает надёжность», а убей кластер `kill -9` и посмотри redo в логе. Не «снимок - это видимость», а открой две сессии и поймай старую версию строки.
- Глубина по требованию
- У шагов есть необязательные врезки «Копнуть глубже»: история, граничный случай, ссылка на исходники на C. Интересно - разворачиваешь. Хочется быстрее - пропускаешь, а фундамент проверят резюме и вопросы в конце главы.
Что встретится в главе
Шесть повторяющихся элементов. Зная их заранее, тратишь меньше внимания на «что это вообще такое».
- Главы
- У каждой главы короткое вступление с целью, основной текст с моделью, лаба в sandbox, резюме из пяти-семи тезисов и контрольные вопросы. В конце - мостик в следующую главу. Первый трек бесплатный, остальное по подписке.
- Уроки в sandbox
- Отдельная вкладка /lessons. Открываешь урок - в браузере поднимается контейнер с PostgreSQL 17, появляется psql, каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.
- Две сессии
- MVCC, блокировки и deadlock не понять в одной сессии. Для таких лаб sandbox поднимает две psql-сессии в табах: в одной меняешь данные, в другой смотришь, что видно и что заблокировано.
- Врезки
- Два типа. «Копнуть глубже» - история и исходники, можно пропустить. «Подводный камень» - типовая ошибка (двойное кэширование, миф «VACUUM возвращает место на диск») и почему она получается; этот тип лучше не пропускать.
- Справочник [[slug]]
- Двойные квадратные скобки в главах рендерятся как ссылки на статьи в /kb - короткие выжимки по одному понятию: snapshot, xmin/xmax, fillfactor, wraparound. Девять категорий: storage, mvcc, vacuum, buffers-wal, locks, planner, indexes, replication, ops.
- Сквозная база
- Через всю книгу идёт одно маленькое приложение-блог: `users`, `posts`, `comments`, `tags`. Достаточно мало, чтобы держать в голове, достаточно богато для индексов, join-ов, jsonb и раздувания.
Карта учебника
Одиннадцать частей: от модели хранения к практике эксплуатации. Каждая опирается на предыдущую, но Части I и II - фундамент, без которого остальное держится плохо.
Часть 0
Карта территории
Зачем читать про внутренности, как устроены книга и sandbox, что предполагается из Linux-базы. Карта: какую боль закрывает каждая часть.
Часть I
Хранение данных
Процессы и память Postgres, кластер на диске ($PGDATA), страница в 8 КБ и кортеж с системными полями xmin, xmax, ctid. pageinspect показывает не пересказ, а сами байты.
Часть II
Многоверсионность (MVCC)
Снимок как набор чисел и правило видимости. Уровни изоляции от Read Committed до Serializable. HOT-обновления и почему читатели не блокируют писателей.
Часть III
Очистка: vacuum, freeze, wraparound
Мёртвые версии и раздувание, что на самом деле делает VACUUM, заморозка и transaction id wraparound - «судный день» кластера. Тюнинг autovacuum из модели, а не из мифов.
Часть IV
Буферный кеш и журнал
shared_buffers и двойное кэширование с page cache ОС. WAL и LSN, контрольная точка, и почему Postgres переживает kill -9: redo от последней контрольной точки.
Часть V
Блокировки
Режимы блокировок строк и таблиц, неявные блокировки от DDL, pg_locks. Как возникает и как находится deadlock. Лёгкие и рекомендательные блокировки.
Часть VI
Планировщик и выполнение
Путь запроса от parser к executor. Статистика и оценки стоимости, почему оценки врут. Способы доступа и стратегии соединения. Чтение EXPLAIN (ANALYZE, BUFFERS) по узлам.
Часть VII
Индексы
B-tree как рабочая лошадка, его страницы через pageinspect. GIN, GiST, BRIN, Hash - под какие данные. Частичные, покрывающие и составные индексы на практике.
Часть VIII
Репликация
Физическая репликация: streaming, hot standby, слоты, отставание. Логическая репликация: публикации и подписки. Пулинг соединений и зачем он нужен процессной модели.
Часть IX
Эксплуатация и анти-паттерны
Конфигурация, которая правда важна, через призму модели. Расширения для интроспекции. Бэкап, PITR и обновление: логический dump против физического basebackup.
Часть X
Капстоун
Заведомо больной кластер: раздувание плюс устаревшая статистика плюс плохой индекс плюс растущий wraparound. Диагностируешь инструментами книги и лечишь, объясняя каждый шаг через модель.
Полный список глав с группировкой по частям - на главной курса. Справочник по понятиям - /kb.
С чего начать
Никаких pre-assessment. Выбери, что ближе. Если ошибёшься - мостики внутри глав подскажут вернуться или пройти быстрее.
Чего в книге нет
Границы важнее содержания - чтобы не было ложных ожиданий.
- Синтаксис SQL с нуля. JOIN, нормальные формы, оконные функции есть в сотне других мест. Здесь предполагается, что SELECT и UPDATE ты уже писал.
- Готовые рецепты тюнинга без модели. «Поставь shared_buffers = 25% RAM» работает, пока не сломается, а почему - непонятно. Мы выводим настройки из устройства, а не заучиваем.
- Патчи в ядро Postgres на C. Это следующий уровень и отдельная книга - см. исходники и рассылку pgsql-hackers.
- Сравнение Postgres с MySQL, Oracle и облачными форками. Берём один движок и копаем его глубоко, а не широко по верхам.
Соседние учебники
PostgreSQL стоит на системном фундаменте. Книга самодостаточна, но если процессы, fsync и page cache - незнакомая территория, рядом лежит остальной портфель той же серии.
LinuxLab - учебник по Linux и сетям. Прямой пререквизит: процессы и fork, сигналы, память и page cache, файловая система. Postgres - капстоун этих знаний.
Git - учебник по Git и GitHub, тоже сначала модель, потом команды. И TerraformLab - Terraform с песочницей на LocalStack.