linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
Часть X — Капстоун

$ глава 46 · 35 минут

Мост к исходникам (advanced)

Эта глава - не про новый механизм, а про следующий шаг. Всю книгу мы наблюдали внутренности через инструменты: pageinspect показывал страницу, EXPLAIN - план, системные представления - статистику. Но за каждым из этих механизмов стоит конкретный код, который можно открыть и прочитать.

Хорошая новость: ты к этому уже готов. Самое трудное в чтении чужого кода - не синтаксис, а понимание, что вообще происходит. Эту часть мы закрыли: ты знаешь, как устроена видимость, откуда берётся стоимость, что делает vacuum. Осталось научиться входить в код от модели, и эта глава даёт карту входа.

46.1 Почему код читать проще, чем кажется

Исходники PostgreSQL - это аккуратный C с обильными комментариями, часто объясняющими не «что», а «почему». Многие файлы открываются длинным комментарием-преамбулой, который пересказывает механизм человеческим языком - ровно то, что мы разбирали в книге.

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

46.2 Карта входа: механизм -> файл

Несколько опорных точек. Каждая - механизм, который мы вскрывали, и место в дереве исходников, где он живёт:

  • Видимость версий строк (xmin/xmax, правила снимка) - heapam_visibility.c. Здесь решается, видна ли версия строки данному снимку, - сердце MVCC.
  • Стоимостная модель планировщика - costsize.c. Функции вида cost_seqscan, cost_index считают те самые числа cost, которые мы воспроизводили руками.
  • Очистка - модуль vacuum в access/heap: prune, removable cutoff, заморозка.
  • Журнал предзаписи - xlog.c и соседи: запись WAL, контрольные точки, recovery.
  • B-tree - каталог access/nbtree: спуск по дереву, split, дедупликация.

Это не полный список, а несколько якорей. От любого из них видны соседние файлы по #include и по вызовам.

46.3 Как идти от механизма к функции

Рабочий приём - не «открыть и читать сверху», а идти от наблюдаемого к коду:

  1. Возьми механизм, который понимаешь по книге (скажем, стоимость seq scan).
  2. Найди функцию по имени, отражающему механизм (cost_seqscan).
  3. Прочитай её преамбулу-комментарий - она часто пересказывает ровно ту формулу, что ты считал руками.
  4. Сверь: совпадает ли код с твоей моделью? Где модель была упрощением?

Этот последний шаг - самый ценный. Книга давала рабочую модель; код показывает, где модель огрублена ради ясности, а где совпадает буквально. Так модель становится точной, а не приблизительной.

46.4 Что дальше

Книга заканчивается, но изнанка PostgreSQL - нет. Дальше каждый механизм можно углублять: побайтовый формат WAL-записей, внутренности GIN и RUM, предикатные блокировки SSI, планировщик соединений. Везде работает один и тот же подход, которым мы пользовались всю книгу: найти инструмент-линзу, предсказать вывод, проверить, и только потом обобщить в правило.

Ты уносишь не список фактов, а способ смотреть: «покажи на странице» вместо «поверь на слово». С ним любой новый механизм PostgreSQL - не магия, а структура данных, которую можно вскрыть и понять.

Резюме

  • Исходники PostgreSQL - аккуратный C с комментариями, часто объясняющими «почему»; барьер не в языке, а в том, чтобы знать, какой файл открыть.
  • Вход в код идёт от механизма: ты идёшь к конкретной функции, потому что уже понимаешь, что она должна делать.
  • Опорные точки: видимость - heapam_visibility.c, стоимость - costsize.c (cost_seqscan, cost_index), vacuum - access/heap, журнал - xlog.c, B-tree - access/nbtree.
  • Приём чтения: взять знакомый механизм, найти функцию по имени, прочитать преамбулу, сверить код со своей моделью - и увидеть, где модель была упрощением.
  • Главное, что уносишь из книги, - не список фактов, а способ смотреть: «покажи на странице», предскажи и проверь, потом обобщи.

Контрольные вопросы

  1. Почему вход в исходники PostgreSQL советуют начинать от механизма, а не читать файл подряд?

    Показать ответ

    Потому что самое трудное в чтении чужого кода - не синтаксис, а понимание, что вообще происходит. Если ты уже знаешь механизм (как работает видимость или как считается стоимость), ты идёшь сразу к конкретной функции, отражающей этот механизм, и читаешь её осмысленно. Чтение подряд топит в незнакомых вызовах. От модели к коду - короткий путь, потому что ты ищешь подтверждение того, что уже понимаешь.

  2. Где в исходниках живёт решение о видимости версии строки и почему именно там сердце MVCC?

    Показать ответ

    В heapam_visibility.c. Именно там по xmin/xmax версии и по составу снимка решается, видна ли данная версия строки данной транзакции. Это сердце MVCC, потому что вся многоверсионность сводится к этому вопросу: какие из физически лежащих рядом версий одной строки видит конкретный снимок. Всё остальное (как версии создаются, как чистятся) обслуживает это решение.

  3. Что полезного даёт сверка кода со своей моделью после чтения функции?

    Показать ответ

    Книга даёт рабочую модель, намеренно упрощённую ради ясности. Сверяя её с кодом (например, формулу cost_seqscan с реальной функцией), ты видишь, где модель совпадает буквально, а где была огрублена - какие поправки и краевые случаи код учитывает, а модель опускала. Так приблизительная модель становится точной, и ты понимаешь не только «как примерно», но и «как на самом деле».

← Предыдущая45-optimization-checklist
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки