Последовательный курс без требований к начальным знаниям: от устройства базы и первых SQL-запросов до транзакций, индексов, безопасности, резервных копий и репликации. Каждый новый термин объясняется до использования и закрепляется в отдельной лабораторной работе.
Этот курс начинается с вопроса «что такое база данных?» и постепенно доходит до индексов, резервных копий и репликации. Предварительные знания PostgreSQL и SQL не нужны.
Достаточно уметь открыть терминал и запускать готовые команды. Git, Docker,
psql и устройство учебного стенда объясняются в первом уроке. Все примеры
используют одну предметную область интернет-магазина, поэтому не приходится
заново разбираться в данных в каждом модуле.
Каждый урок следует одному порядку:
Специальные термины сохраняются там, где без них нельзя читать документацию и планы PostgreSQL. При первом появлении рядом даётся русское объяснение.
Вопросы делятся на уровни junior, middle и senior. Это сложность проверки,
а не требование знать тему заранее: нужная модель вводится в предыдущих уроках.
После курса вы сможете:
EXPLAIN и подбирать индекс под конкретный запрос;Основная версия — PostgreSQL 18.4. Лаборатории опубликованы в отдельном репозитории, выпуск v1.1.0.
Первый запуск выполняется так:
git clone --branch v1.1.0 \
https://gitlab.potapov.me/courses/postgresql-labs.git
cd postgresql-labs
make up
make smoke
Команды и требования подробно разобраны в первом уроке. Стенд запускается в Docker и хранит данные в отдельном именованном томе. Разрушающие упражнения не должны выполняться в системной или рабочей базе.
На сайте находятся уроки, вопросы и итоговый экзамен. SQL-лаборатории запускаются локально: одноразовой базы прямо в браузере пока нет.
SELECT, NULL, сортировка и выдача страницами.INSERT, UPDATE, DELETE, MERGE и безопасные повторы.JOIN.EXPLAIN и проводить воспроизводимый опыт.Итоговый проект собирает темы курса в одну систему. Нужно спроектировать таблицы, провести миграцию, защитить одновременные изменения, разобрать планы, добавить индексы, настроить RLS, создать копию и описать восстановление после отказа.
Каждое решение сопровождается измерением или проверкой. Цель проекта — не повторить команды, а показать, почему выбран именно этот вариант.
Версия курса: 5.3
Среда выполнения: PostgreSQL 18.4
Последнее обновление: 2026-07-20
База данных, таблица, сервер, клиент, psql, MVCC и WAL простыми словами
Смысл строки, ключи, ограничения, связи и данные разных организаций
Зависимости между данными, ошибки повторения и осознанное хранение итогов
Целые и точные числа, текст, время, UUID, адреса, диапазоны и массивы
Структура запроса, NULL, поиск, сортировка и выдача данных страницами
Миграции, блокировки, поэтапное заполнение и совместимость версий приложения
NOT NULL, CHECK, UNIQUE, внешние ключи и проверка старых строк
INSERT, UPDATE, DELETE, MERGE, импорт файлов и безопасный повтор команд
Внутреннее и левое соединение, размножение строк, EXISTS и LATERAL
COUNT, SUM, GROUP BY, HAVING, условные показатели и подытоги
EXISTS, CTE, материализация, рекурсия и объединение запросов
Нумерация, рейтинги, накопительные итоги, рамки, LAG и LEAD
Граница обычных столбцов, поиск внутри JSONB и GIN-индексы
LIKE, триграммы, полнотекстовый документ, ранжирование и качество выдачи
Обычные и материализованные представления, права и обновление данных
SQL, PL/pgSQL, изменчивость, динамические команды и права владельца
Триггерные функции, запуск до и после команды, аудит и скрытая цена
Снимки данных, уровни изоляции, блокирование, взаимоблокировки и повторы
Страницы, версии строк, HOT, TOAST, VACUUM и контрольные точки
Оценка числа строк, статистика, условная стоимость и параметры запроса
Дерево плана, строки, повторы, буферы, временные файлы и честное сравнение
Способы чтения, карта видимости, цена записи и безопасное построение
Порядок ключей, частичные индексы, выражения и дополнительные столбцы
Методы доступа для JSONB, массивов, диапазонов и очень больших таблиц
Сеансы, счётчики, ожидания, autovacuum, место на диске и оповещения
Минимальные права, search_path, RLS, пароли и защищённые соединения
Допустимая потеря данных, pg_dump, PITR, секции и переход между версиями
Физическая и логическая репликация, переключение, PgBouncer и исходящая очередь
Доступен после всех тем (0 из 28)
Доступен после зачёта
Программа, которая хранит данные, выполняет запросы и управляет одновременным доступом, правами и восстановлением.
Пример
PostgreSQL — СУБД; база `course` — один из наборов данных, которыми она управляет.Связанные термины
Объектно-реляционная СУБД с открытым исходным кодом. Сервер PostgreSQL хранит данные и выполняет SQL-команды клиентов.
Пример
Программа `postgres` запускает сервер, а `psql` подключается к нему как клиент.Связанные термины
Все базы, которыми управляет один экземпляр сервера PostgreSQL и которые находятся в одном каталоге данных. Это не обязательно несколько компьютеров.
Пример
Один кластер может содержать базы `course`, `postgres` и `analytics`.Связанные термины
Отдельное пространство данных внутри кластера PostgreSQL. Клиент выбирает одну базу при подключении.
Пример
Параметр `-d course` команды `psql` выбирает базу `course`.Связанные термины
Именованное пространство внутри базы данных, которое группирует таблицы, функции и другие объекты.
Пример
В имени `marketplace.orders` первая часть — схема, вторая — таблица.Связанные термины
Набор строк с одинаковыми столбцами. Каждая строка хранит один факт, а тип столбца ограничивает допустимые значения.
Пример
Одна строка `orders` хранит один заказ, а столбец `created_at` — время его создания.Связанные термины
Строка хранит один экземпляр факта, а столбец — одно его свойство одинакового типа для всех строк таблицы.
Пример
В строке заказа `id` и `total_amount` — столбцы с номером и суммой.Связанные термины
Сервер PostgreSQL хранит данные и выполняет команды. Клиент, например `psql` или приложение, подключается и отправляет ему SQL.
Пример
Python-приложение и `psql` — разные клиенты одного сервера PostgreSQL.Связанные термины
Подключение — канал связи клиента с сервером. Сеанс — период от установки этого подключения до его закрытия вместе с текущими настройками.
Пример
Команда `SET TIME ZONE` без другой области действия меняет настройку текущего сеанса.Связанные термины
Учётная запись PostgreSQL и набор прав. Роль с `LOGIN` может подключаться, а роль без `LOGIN` удобно использовать как группу разрешений.
Пример
Роль `app_read` получает право чтения, а `app_runtime` наследует её права.Связанные термины
Текстовый клиент PostgreSQL для подключения, выполнения SQL и служебных команд, начинающихся с обратной косой черты.
Пример
Команда `\conninfo` показывает текущее подключение, а `\q` завершает psql.Связанные термины
Версионируемый набор команд, который изменяет структуру базы: создаёт таблицу, добавляет столбец, ограничение или индекс.
Пример
Миграция сначала добавляет необязательный столбец, затем заполняет его и только после проверки включает `NOT NULL`.Связанные термины
Точное утверждение о том, какой факт представляет одна строка и при каких условиях две строки считаются разными.
Пример
Одна строка order_items — один товар внутри одного заказа; ключ (order_id, product_id).Связанные термины
Зависимость X → Y, при которой одинаковое значение X определяет одно значение Y в допустимом состоянии данных.
Пример
plan_code → plan_name; атрибут тарифа хранится в справочнике тарифов.Связанные термины
Набор требований к зависимостям отношения, уменьшающий аномалии вставки, обновления и удаления.
Пример
Транзитивно зависящие атрибуты тарифа вынесены из назначения тарифа организации.Связанные термины
Осознанное дублирование или предварительное вычисление данных ради измеримой скорости, с правилами обновления, сверки и исправления расхождений.
Пример
Счётчик заказов хранится рядом с организацией и регулярно сверяется с исходными orders.Связанные термины
Первичный ключ: уникальный идентификатор строки, который не допускает NULL. У таблицы один такой ключ, но он может состоять из нескольких столбцов.
Пример
PRIMARY KEY (order_id, product_id)Связанные термины
Внешний ключ: правило, которое требует, чтобы ссылка в одной таблице вела на существующее уникальное значение другой таблицы.
Пример
FOREIGN KEY (order_id, org_id) REFERENCES orders(id, org_id)Связанные термины
Уникальное ограничение, считающее NULL равными друг другу для проверки уникальности.
Пример
UNIQUE NULLS NOT DISTINCT (org_id, external_alias)Связанные термины
Ограничение с `DEFERRABLE`, проверку которого транзакция может перенести с конца отдельной SQL-команды на момент `COMMIT`.
Пример
SET CONSTRAINTS positions_key DEFERRED;Связанные термины
NULL обозначает отсутствующее или неизвестное значение; большинство сравнений с ним дают UNKNOWN, а WHERE сохраняет только TRUE.
Пример
email IS NULL; выражение email = NULL не является проверкой на NULL.Связанные термины
Тип для конкретного момента времени. При выводе он переводится в часовой пояс сеанса, но исходное название часового пояса в значении не хранится.
Пример
TIMESTAMPTZ '2026-07-19 09:00 Europe/Moscow'Связанные термины
Тип с нижней и верхней границами и явным правилом их включения. Поддерживает пересечение, вхождение и исключающие ограничения.
Пример
tstzrange(started_at, ended_at, '[)')Связанные термины
Продолжение выдачи после значений последней показанной строки вместо поиска и отбрасывания строк через `OFFSET`.
Пример
WHERE (created_at,id) < ($1,$2) ORDER BY created_at DESC,id DESC LIMIT 50Связанные термины
Вставка, которая через `ON CONFLICT` заранее задаёт действие при нарушении уникальности: ничего не делать или обновить существующую строку.
Пример
INSERT ... ON CONFLICT (org_id, external_id) DO UPDATE SET attempts = inbox.attempts + 1 RETURNING *;Связанные термины
Команда, которая сопоставляет входные строки с целевой таблицей и по условиям `WHEN` вставляет или обновляет данные. Вход должен однозначно определять целевую строку.
Пример
MERGE INTO inventory USING incoming ON ... WHEN MATCHED THEN UPDATE ...;Связанные термины
Повтор операции с тем же ключом приводит к тому же наблюдаемому бизнес-результату без повторного применения эффекта.
Пример
UNIQUE external_id в inbox защищает повторную доставку webhook.Связанные термины
Разрешает элементу FROM ссылаться на столбцы предшествующих элементов FROM и вычисляться для каждой их строки.
Пример
LEFT JOIN LATERAL (SELECT ... ORDER BY created_at DESC,id DESC LIMIT 1) p ON trueСвязанные термины
Увеличение числа строк при соединении, когда одной строке одной таблицы соответствует несколько строк другой.
Пример
JOIN orders→items→payments может перемножить items и payments до агрегации.Связанные термины
Проверка отсутствия подходящей строки. В отличие от `NOT IN`, безопасно работает, когда внутренний столбец содержит NULL.
Пример
WHERE NOT EXISTS (SELECT 1 FROM bans b WHERE b.user_id = u.id)Связанные термины
Группировка, которая одним запросом вычисляет несколько явно заданных уровней: детали, подытоги и общий итог. `GROUPING` отличает служебный NULL итога от NULL исходных данных.
Пример
GROUP BY GROUPING SETS ((org_id,status),(org_id),())Связанные термины
Часть строк группы, которую оконная функция использует для текущей строки, например от начала группы до текущей строки.
Пример
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWСвязанные термины
Разобранное двоичное представление JSON с операторами поиска и индексированием. Не заменяет обычные столбцы, типы и внешние ключи для устойчивых правил.
Пример
attributes @> '{"wireless": true}'::jsonbСвязанные термины
`tsvector` хранит подготовленные лексемы документа, а `tsquery` — условие полнотекстового поиска, разобранное той же языковой конфигурацией.
Пример
search_vector @@ websearch_to_tsquery('simple', 'postgresql -beginner')Связанные термины
Физически сохранённый результат запроса. Он не меняется вместе с исходными таблицами и остаётся устаревшим до явного `REFRESH`.
Пример
REFRESH MATERIALIZED VIEW CONCURRENTLY org_sales;Связанные термины
Обещание `IMMUTABLE`, `STABLE` или `VOLATILE` о том, от чего зависит результат функции и как часто он может меняться. Влияет на допустимые оптимизации.
Пример
Функция, читающая изменяемую таблицу, не может честно быть IMMUTABLE.Связанные термины
Функция, которая выполняется с правами владельца. Требует безопасного `search_path`, полных имён объектов и минимальных прав `EXECUTE`.
Пример
SECURITY DEFINER SET search_path = pg_catalog, trusted_appСвязанные термины
Набор старых или новых строк, изменённых одной командой. Доступен подходящему триггеру `AFTER` уровня команды для обработки всего набора сразу.
Пример
REFERENCING OLD TABLE AS old_rows NEW TABLE AS new_rowsСвязанные термины
Группа команд, которая фиксируется целиком через `COMMIT` или отменяется через `ROLLBACK`. Внешние действия, например сетевой вызов, требуют отдельного согласования.
Пример
BEGIN; UPDATE inventory ... RETURNING available; INSERT INTO outbox ...; COMMIT;Связанные термины
Правила, по которым PostgreSQL выбирает видимые версии строк для SQL-команды или транзакции согласно уровню изоляции.
Пример
READ COMMITTED получает новый snapshot для каждого statement.Связанные термины
Цикл ожидания, в котором транзакции держат нужные друг другу блокировки. PostgreSQL обнаруживает цикл и отменяет одну транзакцию с кодом `40P01`.
Пример
Две транзакции блокируют строки A и B в противоположном порядке.Связанные термины
Реализация уровня `SERIALIZABLE`, которая отслеживает опасные зависимости чтения и записи и отменяет транзакцию, способную создать невозможный последовательный результат.
Пример
Приложение повторяет всю транзакцию после SQLSTATE 40001.Связанные термины
Обновление без новых индексных записей. Возможно, если индексируемые значения не меняются и новая версия строки помещается на той же странице таблицы.
Пример
Низкий fillfactor оставляет место для обновления неиндексируемого status.Связанные термины
Журнал предварительной записи: описание изменения надёжно сохраняется до соответствующей страницы таблицы. Используется для восстановления после сбоя и физической репликации.
Пример
pg_current_wal_lsn() показывает текущую позицию WAL записи кластера.Связанные термины
Обслуживание MVCC: делает место старых версий строк повторно используемым, поддерживает карту видимости и предотвращает переполнение идентификаторов транзакций.
Пример
VACUUM (VERBOSE, ANALYZE) marketplace.orders;Связанные термины
Фоновые процессы, которые автоматически запускают `VACUUM` и `ANALYZE` по числу изменений, возрасту транзакций и другим условиям. Параметры можно задавать для отдельной таблицы.
Пример
ALTER TABLE events SET (autovacuum_vacuum_scale_factor = 0.02);Связанные термины
Предполагаемое число строк узла плана. От него зависят порядок соединений, способ чтения, алгоритмы и ожидаемая память.
Пример
Сравнивайте estimated rows с actual rows × loops в нижнем проблемном узле.Связанные термины
Статистика по сочетанию столбцов или выражений, которая описывает зависимости, число разных комбинаций и частые значения для более точной оценки связанных условий.
Пример
CREATE STATISTICS country_postal (dependencies, mcv) ON country, postal_code FROM deliveries;Связанные термины
Относительная безразмерная оценка работы для сравнения вариантов плана. Не является прогнозом времени в миллисекундах.
Пример
total cost помогает выбрать plan только внутри текущей cost model и статистики.Связанные термины
Действительно выполняет SQL-команду и добавляет к плану фактическое число строк, повторов и время. Параметры `BUFFERS`, `WAL` и `SETTINGS` показывают дополнительные измерения.
Пример
EXPLAIN (ANALYZE, BUFFERS, WAL, SETTINGS, FORMAT JSON) SELECT ...;Связанные термины
Упорядоченный метод индекса для равенства, диапазонов и сортировки. Возможности определяют класс операторов и порядок ключей.
Пример
CREATE INDEX ON events (org_id, occurred_at DESC, id DESC);Связанные термины
Связывает тип данных и набор операций с методом доступа и определяет, какие условия способен обслуживать индекс.
Пример
attributes jsonb_path_ops в GIN оптимизирует containment/jsonpath, но не весь jsonb_ops API.Связанные термины
Инвертированный метод индекса для значений, содержащих много элементов, например `tsvector`, массивов и JSONB.
Пример
CREATE INDEX ON products USING gin (attributes jsonb_path_ops);Связанные термины
Расширяемая основа для сбалансированных деревьев. Конкретный класс операторов добавляет поддержку диапазонов, геометрии и других типов.
Пример
CREATE INDEX ON bookings USING gist (reserved_during);Связанные термины
Компактный индекс с краткими сведениями о группах страниц таблицы. Эффективен, когда значения связаны с физическим порядком строк, и допускает приблизительные совпадения с повторной проверкой.
Пример
CREATE INDEX ON events USING brin (occurred_at) WITH (pages_per_range=32);Связанные термины
Служебный файл, отмечающий полностью видимые и замороженные страницы таблицы. Позволяет `Index Only Scan` не обращаться к таблице для полностью видимой страницы.
Пример
Heap Fetches в плане растут, если нужные pages ещё не all-visible.Связанные термины
Политики, которые ограничивают доступные строки по команде и роли. Суперпользователь и `BYPASSRLS` обходят RLS, а владелец обычно обходит её без `FORCE`.
Пример
CREATE POLICY tenant_isolation ON notes USING (org_id = trusted_org());Связанные термины
Порядок схем для поиска объекта по неполному имени. Доступная для записи ранняя схема создаёт риск подмены объекта в коде с повышенными правами.
Пример
SECURITY DEFINER SET search_path = pg_catalog, trusted_appСвязанные термины
Максимально допустимый объём потери данных, обычно выраженный во времени между последней восстанавливаемой точкой и сбоем.
Пример
RPO 5 минут требует проверенной доставки и хранения WAL с меньшим окном.Связанные термины
Максимально допустимое время восстановления работоспособного сервиса после сбоя. Подтверждается тренировкой, а не размером файла копии.
Пример
Restore drill измеряет время до запуска проверенной восстановленной БД.Связанные термины
Восстановление базовой физической копии с воспроизведением архивного WAL до выбранного времени, идентификатора транзакции, точки восстановления или позиции LSN.
Пример
Recovery останавливается у контрольного restore point до ошибочного DELETE.Связанные термины
Передача и воспроизведение WAL для близкой побайтовой копии всего кластера совместимой основной версии. Синхронный или асинхронный режим меняет сохранность и задержку.
Пример
Standby replay position сравнивают с primary WAL position и lag в bytes/time.Связанные термины
Декодирование и применение изменений строк выбранных опубликованных таблиц. Структура, роли, последовательности и конфликты управляются отдельно.
Пример
CREATE PUBLICATION app_pub FOR TABLE orders, payments;Связанные термины
Одновременная запись в два узла, каждый из которых считает себя ведущим. Предотвращается единственным правом переключения и надёжной изоляцией старого ведущего.
Пример
Перед promotion orchestrator изолирует старый primary от клиентов и storage/network.Связанные термины
Режим пула, в котором серверное соединение закрепляется за клиентом только до `COMMIT` или `ROLLBACK`. Состояние сеанса между транзакциями не гарантировано.
Пример
Session advisory locks и temporary tables несовместимы с ожиданием постоянного backend.Связанные термины
Запись бизнес-изменения и будущего сообщения в одной транзакции базы с последующей публикацией, которую можно безопасно повторить.
Пример
INSERT INTO payment_inbox; UPDATE orders; INSERT INTO outbox; COMMIT;Связанные термины
Состав курса, уровни, практика и способы проверки знаний.
Курс включает 28 тем и 168 вопросов с разбором ответа, а также 28 тематических лабораторных работ. Начать можно с первой темы курса.
Маршрут охватывает уровни Junior, Middle, Senior. Темы расположены от основы к более сложным инженерным задачам, поэтому можно начать с подходящего места и не пропускать важные зависимости.
К темам привязано 28 лабораторных заданий. Условия и ссылка на репозиторий находятся на странице курса и внутри соответствующих учебных материалов.
После прохождения тем доступен зачёт по курсу «PostgreSQL 18 с нуля до эксплуатации» — 20 случайных вопросов с порогом 80%. После зачёта открывается экзамен с развёрнутыми ответами и автоматической оценкой, приближённый к техническому собеседованию.
Да, курс полностью бесплатный: все 28 тем доступны без оплаты.
Backend-собеседования почти всегда включают блок про PostgreSQL — обычно не в формате «назовите определение», а через практические вопросы: как ускорить конкретный запрос, что произойдёт при параллельных транзакциях, почему индекс не используется. Ключевые темы курса под эту часть интервью: