PostgreSQL

19 вопросов

PostgreSQL - основная реляционная СУБД для Go-проектов. MVCC, WAL, уровни изоляции, VACUUM, типы индексов, EXPLAIN ANALYZE, connection pooling, JSONB, upsert - ключевые темы для backend-разработчика.

1 Зачем нужны prepared statements? 🟢 Лёгкий
Ответ: B) Для защиты от SQL-инъекций и кеширования плана запроса

Prepared statements отделяют SQL-код от данных - параметры ($1, $2) передаются отдельно, делая SQL-инъекцию невозможной. PostgreSQL также кеширует план выполнения prepared statement, ускоряя повторные вызовы.

Подробнее →
2 Что такое MVCC в PostgreSQL? 🟡 Средний
Ответ: B) Многоверсионное управление конкурентным доступом

MVCC (Multi-Version Concurrency Control) - каждая транзакция видит свой снимок данных. Читатели не блокируют писателей и наоборот. При UPDATE создаётся новая версия строки, старая остаётся для текущих транзакций. VACUUM удаляет устаревшие версии.

Подробнее →
3 Что такое WAL (Write-Ahead Log)? 🟡 Средний
Ответ: B) Журнал транзакций - записи пишутся в лог ДО применения к данным

WAL гарантирует durability (D в ACID): изменения сначала записываются в журнал, потом в таблицы. При сбое PostgreSQL восстанавливается из WAL. WAL также используется для репликации (streaming replication) и point-in-time recovery.

Подробнее →
4 Какой уровень изоляции транзакций по умолчанию в PostgreSQL? 🟡 Средний
Ответ: B) Read Committed

Read Committed - каждая команда в транзакции видит данные, зафиксированные до её начала. Phantom reads возможны. Repeatable Read защищает от phantom reads. Serializable - полная изоляция, но медленнее. PostgreSQL не реализует Read Uncommitted.

Подробнее →
5 Для чего нужен VACUUM в PostgreSQL? 🟡 Средний
Ответ: B) Удаление мёртвых строк, оставшихся после UPDATE/DELETE

MVCC создаёт новые версии строк при UPDATE/DELETE. Старые версии (dead tuples) занимают место. VACUUM помечает их пространство для повторного использования. VACUUM FULL перезаписывает таблицу, но блокирует её.

Подробнее →
6 Какой тип индекса используется по умолчанию в PostgreSQL? 🟡 Средний
Ответ: B) B-tree

B-tree - индекс по умолчанию. Поддерживает =, <, >, <=, >=, BETWEEN, IN, IS NULL. Hash - только =. GiST - геометрия, полнотекстовый поиск. GIN - массивы, JSONB. BRIN - большие таблицы с естественной сортировкой (по дате).

Подробнее →
7 Что делает EXPLAIN ANALYZE? 🟡 Средний
Ответ: B) Выполняет запрос и показывает реальный план с временем выполнения

EXPLAIN показывает предполагаемый план. EXPLAIN ANALYZE реально выполняет запрос и показывает фактическое время, количество строк на каждом шаге. Важно: ANALYZE выполняет запрос, включая INSERT/UPDATE/DELETE. Для безопасности оборачивайте в транзакцию с ROLLBACK.

Подробнее →
8 Зачем нужен пул соединений (connection pool) к PostgreSQL? 🟡 Средний
Ответ: B) Для переиспользования соединений и снижения нагрузки на создание новых

Создание соединения с PostgreSQL - дорогая операция (fork процесса, TLS, аутентификация). Пул (pgxpool в Go, PgBouncer как прокси) поддерживает готовые соединения и раздаёт их по запросу. Снижает латентность и ограничивает число одновременных соединений.

Подробнее →
9 Чем TRUNCATE отличается от DELETE? 🟡 Средний
Ответ: B) TRUNCATE быстрее, не пишет в WAL построчно, сбрасывает автоинкремент

DELETE удаляет строки по одной, пишет каждую в WAL, можно с WHERE, срабатывают триггеры. TRUNCATE - мгновенное удаление всех строк, сбрасывает последовательности (RESTART IDENTITY), не вызывает row-level триггеры. Оба можно откатить внутри транзакции.

Подробнее →
10 Чем синхронная репликация отличается от асинхронной? 🟡 Средний
Ответ: B) Синхронная ждёт подтверждения от реплики, асинхронная - нет

Синхронная: master ждёт подтверждения записи от реплики - данные не потеряются при падении master. Медленнее (ожидание сети). Асинхронная: master не ждёт - быстрее, но при падении последние записи могут потеряться (replication lag).

Подробнее →
11 Для чего используется pg_stat_statements? 🟡 Средний
Ответ: B) Для сбора статистики по всем выполненным SQL-запросам

pg_stat_statements собирает: количество вызовов, суммарное/среднее время, строки для каждого запроса. Незаменимый инструмент оптимизации - показывает самые медленные и частые запросы. Стандарт для PostgreSQL в production.

Подробнее →
12 Как PostgreSQL обрабатывает дедлок между транзакциями? 🟡 Средний
Ответ: B) Обнаруживает и откатывает одну из транзакций

PostgreSQL имеет deadlock detector, проверяющий граф ожидания. При цикле откатывает одну транзакцию с ошибкой 'deadlock detected'. Вторая продолжает. Параметр deadlock_timeout (по умолчанию 1 сек). Для предотвращения: единый порядок блокировки ресурсов.

Подробнее →
13 Чем JSONB отличается от JSON в PostgreSQL? 🟡 Средний
Ответ: B) JSONB хранит бинарное представление и поддерживает GIN-индексы

JSON хранит текст как есть (с пробелами, порядком ключей). JSONB парсит и хранит бинарно - быстрее при чтении и фильтрации. JSONB поддерживает GIN-индексы для поиска по ключам/значениям. В 99% случаев используйте JSONB.

Подробнее →
14 Что делает INSERT ... ON CONFLICT DO UPDATE (upsert)? 🟡 Средний
Ответ: B) Вставляет или обновляет при конфликте уникального ключа

ON CONFLICT реализует upsert: если INSERT нарушает unique constraint - выполняется UPDATE. INSERT INTO users (email, name) VALUES ($1, $2) ON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name. EXCLUDED - псевдотаблица с новыми значениями. DO NOTHING молча пропускает конфликт.

Подробнее →
15 Чем материализованное представление отличается от обычного VIEW? 🟡 Средний
Ответ: B) MATERIALIZED VIEW хранит результат на диске, VIEW вычисляет при каждом запросе

VIEW - виртуальная таблица, запрос выполняется каждый раз. MATERIALIZED VIEW сохраняет результат на диск - быстрое чтение, но данные устаревают. REFRESH MATERIALIZED VIEW обновляет. CONCURRENTLY - обновление без блокировки чтения. Полезно для тяжёлых аналитических запросов.

Подробнее →
16 Что покажет EXPLAIN, если вместо Index Scan отображается Seq Scan? 🟡 Средний
Ответ: A) Индекс не создан или запрос возвращает слишком много строк

Seq Scan вместо Index Scan означает: 1) индекс не существует; 2) запрос возвращает >5-10% таблицы (sequential scan быстрее); 3) устаревшая статистика (ANALYZE обновит); 4) неподходящий тип индекса. Используйте EXPLAIN ANALYZE для фактического плана.

Подробнее →
17 Что такое частичный индекс (partial index)? 🔴 Сложный
Ответ: B) Индекс только для строк, удовлетворяющих условию WHERE

Partial index индексирует только строки, соответствующие условию: CREATE INDEX idx ON orders(status) WHERE status = 'pending'. Занимает меньше места и быстрее обновляется. Эффективен, когда запросы всегда фильтруют по определённому условию.

Подробнее →
18 Что такое покрывающий индекс (covering index)? 🔴 Сложный
Ответ: B) Индекс, содержащий все данные запроса без обращения к таблице

Покрывающий индекс содержит все столбцы запроса - PostgreSQL выполняет Index Only Scan без обращения к heap. CREATE INDEX idx ON orders(status) INCLUDE (total) - INCLUDE добавляет неключевые столбцы. Значительно ускоряет чтение на горячих запросах.

Подробнее →
19 Какой режим PgBouncer наиболее экономно использует соединения? 🔴 Сложный
Ответ: B) Transaction pooling

Transaction pooling: соединение возвращается в пул после каждой транзакции - несколько клиентов разделяют одно соединение. Session pooling: закреплено на всю сессию (наименее эффективно). Statement pooling: после каждого запроса (нет multi-statement транзакций).

Подробнее →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.