Базы данных
Трек баз данных: тест с выбором ответа
Шесть вопросов поперёк всего трека. Каждый — момент в жизни одного продукта (от единственной таблицы до кластера на миллиард строк), где сталкиваются два понятия из баз данных и нужно выбрать рычаг, чинящий именно нужный слой.
Убедись, что собираешь трек в цепочку: смоделировать схему, выбрать индекс, который планировщик реально использует, прочитать, почему план сломался, выбрать уровень изоляции, рассчитать размер пула, выстроить миграцию без даунтайма и решить, нужен ли шардинг вообще.
Запрос фильтрует orders по тенанту и дате, ты добавляешь composite-индекс. Оба плана ниже — по одной таблице, различается лишь порядок колонок индекса. Почему планировщик пропускает индекс в плане A? ```sql -- query SELECT * FROM orders WHERE tenant_id = 42 AND created_at >= '2026-01-01'; -- A: CREATE INDEX ON orders (created_at, tenant_id); -> Seq Scan -- B: CREATE INDEX ON orders (tenant_id, created_at); -> Index Scan ```
Ночной batch держит одну транзакцию открытой три часа. За это же окно OLTP-таблица под активными UPDATE растёт с 8 ГБ до 40 ГБ на диске, хотя число живых строк почти не меняется. Что связывает долгую транзакцию с bloat?
Отчётный запрос был быстрым месяцами, потом внезапно выбрал nested-loop join вместо hash join и вырос с 200 мс до 40 с после всплеска импорта данных. EXPLAIN ANALYZE показывает: планировщик ждал 12 строк из одной ветки, получил 2,1 млн. Корневая причина и первый устойчивый фикс?
Ты ставишь приложение за PgBouncer в transaction mode, чтобы пережить storm соединений. Сразу же приложение падает с ошибкой, что prepared statements не существуют, а SET search_path, выполненный при коннекте, больше не держится. Почему?
Нужно переименовать горячую колонку `email` в `email_address` на таблице с 500 млн строк без даунтайма, пока старый и новый код приложения работают бок о бок во время rolling-деплоя. Какая последовательность верна?
Multi-tenant SaaS упирается в лимит записи на одном Postgres. Команда предлагает hash-шардинг по колонке `country`. Три тенанта в одной стране дают 70% трафика. Что пойдёт не так и какой ключ шардирования лучше?
Трек — одно дерево решений для растущего продукта: сначала смоделируй схему ради integrity, добавь индекс, чья ведущая колонка совпадает с паттерном доступа, читай план, чтобы ловить ошибки оценки строк до каскада, держи транзакции короткими, чтобы MVCC мог вакуумить, рассчитай размер и режим пула, чтобы пережить storm соединений, разложи каждое ломающее изменение на фазы expand-contract и берись за шардинг только после выбора высококардинального ко-локирующего ключа и исчерпания всех более дешёвых рычагов. Каждый режим отказа сводится к одному вопросу: какой слой — узкое место и какой самый дешёвый рычаг его чинит?