Вопросы на собеседовании: Администратор БД
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Middle.
Смотреть пример резюме: Администратор БД →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
База разбирает и проверяет SQL, преобразует его во внутреннее дерево запроса, выбирает план выполнения и запускает этот план.
- Parsing проверяет синтаксис и разрешает ссылки на объекты, столбцы, типы и права.
- Rewriting может раскрывать views или применять правила СУБД до планирования.
- Оптимизатор сравнивает допустимые пути доступа и порядки joins по статистике и cost model.
- Executor запускает выбранные операторы и возвращает строки с учётом transaction visibility.
Зачем это спрашивают: Интервьюер проверяет понимание оптимизации как одного этапа более широкого процесса обработки запроса.
EXPLAIN показывает оценочный план оптимизатора, а EXPLAIN ANALYZE выполняет statement и добавляет фактические runtime-данные.
- Estimated rows и costs берутся из статистики и cost model СУБД.
- Actual rows, loops и timing показывают отличие выполнения от оценок.
- Поскольку ANALYZE запускает statement, write queries могут изменить данные, если их правильно не обернуть и не откатить.
- Опции PostgreSQL вроде BUFFERS показывают активность cache и I/O вместе со временем.
Зачем это спрашивают: Сильный ответ отличает прогноз от измерения и понимает реальные side effects выполнения.
Эти пути доступа меняют startup cost, random access и массовое чтение страниц в зависимости от оценочной selectivity.
- Sequential scan читает страницы таблицы и может быть эффективен, когда нужна большая её часть.
- Index scan следует по подходящим записям индекса к строкам таблицы и подходит selective predicates.
- Bitmap scan PostgreSQL сначала собирает расположение подходящих строк, затем посещает страницы таблицы более сгруппированно.
- Оптимизатор выбирает по оценкам стоимости страниц, числа строк, нужного порядка и предположений cache.
Зачем это спрашивают: Интервьюер оценивает понимание того, почему индекс не всегда является самым дешёвым путём доступа.
Три алгоритма join объединяют входы через повторный поиск, хеширование или упорядоченный проход.
- Nested loop сканирует внутренний вход для каждой внешней строки и эффективен при малой внешней стороне и индексированном поиске внутри.
- Hash join строит hash table из одного входа и проверяет её другим, обычно для соединений по равенству.
- Merge join продвигается по двум входам, отсортированным по совместимым join keys, и эффективен для больших упорядоченных наборов.
- Условие join, размеры входов, порядок сортировки, память и оценки определяют доступный и выгодный алгоритм.
Зачем это спрашивают: Сильный ответ связывает каждый алгоритм join со свойствами входов, а не ранжирует их универсально.
Cardinality estimates прогнозируют число строк, а cost estimates сравнивают ожидаемую работу ресурсов в специфичных для СУБД единицах.
- Costs обычно объединяют моделируемый доступ к страницам, CPU processing, sorting и startup операторов.
- Это относительные значения планирования, а не прямые миллисекунды.
- Ошибка числа строк в начале плана может привести к неудачному алгоритму или порядку joins далее.
- Фактические метрики выполнения сравнивают с оценками, чтобы понять, отражают ли статистика и предположения данные.
Зачем это спрашивают: Интервьюер проверяет, читает ли кандидат оценки как входы оптимизатора, а не буквальные обещания времени выполнения.
Планировщик использует сводные данные о распределении и размере таблиц для оценки cardinality predicates и joins.
- Число строк и страниц оценивает размер relation.
- Число distinct values и доля NULL оценивают selectivity равенства и отсутствующих значений.
- Histograms приближённо описывают распределение диапазонов, а списки most-common values представляют skew.
- Extended или multicolumn statistics могут описывать correlation и dependencies, которые пропускает независимая статистика столбцов.
Зачем это спрашивают: Сильный ответ называет статистику, управляющую cardinality, а не говорит только об использовании metadata.
ANALYZE берёт выборку данных таблицы и обновляет planner statistics, чтобы оценки отражали текущее распределение.
- Workers autovacuum PostgreSQL могут автоматически запускать analyze после достаточного числа изменений таблицы.
- MySQL поддерживает persistent или sampled statistics с engine-specific поведением refresh.
- Sampling target уравновешивает стоимость сбора, размер catalog и точность для неравномерных данных.
- Статистика описывает значения, а не навсегда кеширует query plans, поэтому поведение prepared plans остаётся отдельной темой.
Зачем это спрашивают: Интервьюер оценивает понимание поддержки статистики и её автоматизации в разных СУБД.
Selectivity является долей строк, которые предположительно выполняют предикат, и определяет объём данных для каждого пути доступа.
- Уникальный предикат равенства имеет высокую selectivity, потому что возвращает не более одной строки.
- Boolean-столбец с равномерным делением значений обычно сам по себе неселективен.
- Skew означает, что предикат по одному частому значению ведёт себя иначе, чем по редкому.
- Планировщик оценивает selectivity по статистике и объединяет её со стоимостью I/O, CPU и ordering.
Зачем это спрашивают: Сильный ответ связывает распределение данных с выбором пути и не оценивает selectivity только по типу столбца.
Sargable-предикат позволяет оптимизатору сопоставить условие поиска с упорядоченной или иначе доступной через индекс операцией.
- Прямое сравнение индексированного столбца с совместимым значением обычно является sargable.
- Функция вокруг столбца может помешать обычному индексу, если нет подходящего expression index.
- Неявное преобразование типа на индексированной стороне тоже может заблокировать эффективный поиск.
- Переписывание сначала сохраняет семантику запроса, потому что index-friendly выражение бесполезно при изменении результата.
Зачем это спрашивают: Интервьюер проверяет понимание влияния формы предиката на доступ к индексу без сведения оптимизации к синтаксическим трюкам.
Оптимизатор обычно переставляет и объединяет безопасные предикаты согласно плану, а не их текстовому порядку.
- SQL описывает требуемый результат, а не императивную последовательность проверок строк.
- Predicate pushdown может перемещать фильтры ближе к scans или ниже joins, когда семантика разрешает.
- Volatile functions, outer joins и выражения с возможными ошибками могут ограничивать допустимые преобразования.
- Производительность нужно оценивать по execution plan, а не выводить из порядка условий в тексте запроса.
Зачем это спрашивают: Сильный ответ понимает декларативный SQL и признаёт семантические ограничения преобразований оптимизатора.
Покрывающий индекс содержит все столбцы, необходимые запросу, позволяя СУБД избежать или сократить обращения к строкам таблицы.
- Столбцы поиска и join образуют доступный для поиска ключ индекса.
- Дополнительные выходные столбцы можно включить как non-key payload, если СУБД поддерживает INCLUDE.
- Index-only scans PostgreSQL всё равно зависят от visibility information, определяющей возможность пропустить heap access.
- Широкие индексы требуют больше storage и write bandwidth, поэтому покрытие должно соответствовать устойчивым частым формам запросов.
Зачем это спрашивают: Интервьюер оценивает понимание логического покрытия и engine-specific условий index-only access.
Порядок столбцов должен следовать условиям равенства, границам диапазона, join keys и нужной сортировке обслуживаемых запросов.
- Ведущие столбцы равенства сужают доступный префикс до следующего столбца диапазона.
- После неограниченного диапазона следующие столбцы могут фильтровать, но часто не могут так же эффективно сузить index scan.
- ORDER BY может выиграть при совпадении последовательности и направления с используемым префиксом индекса.
- Одна cardinality не является универсальным правилом, потому что полезность определяет полная форма предиката и сортировки.
Зачем это спрашивают: Сильный ответ применяет поведение leading prefix к структуре запроса вместо правила всегда ставить первым столбец с максимальной cardinality.
Частичный индекс хранит записи только для строк с фиксированным предикатом, уменьшая размер и обслуживание индекса для целевых запросов.
- Индекс WHERE status = 'open' может обслуживать запросы к тому же подмножеству открытых строк.
- Планировщик должен доказать, что предикат запроса подразумевает предикат индекса.
- Частичные уникальные индексы могут обеспечивать уникальность только в подмножестве, например активных записей.
- Они не подходят, когда запросам нужна большая часть исключённых строк или определение подмножества постоянно меняется.
Зачем это спрашивают: Интервьюер проверяет понимание логического следования предикатов и индексации или ограничений по подмножеству.
Индекс по выражению хранит результат детерминированного выражения, чтобы запросы с тем же выражением могли искать напрямую.
- Индекс по lower(email) может поддерживать нормализованный по регистру поиск равенства с той же семантикой.
- Выражение запроса должно достаточно точно совпадать с индексированным, чтобы планировщик его распознал.
- Индексы по выражению также могут обеспечивать уникальность нормализованного представления.
- Вычисление и поддержка выражения добавляют стоимость записи и связывают схему с формой запроса.
Зачем это спрашивают: Сильный ответ объясняет совпадение выражений, нормализованную уникальность и стоимость обслуживания.
Тип индекса определяется оператором и паттерном доступа к данным, а не только типом столбца.
- B-tree поддерживает равенство, диапазоны, сортировку и prefix scans сортируемых значений.
- Hash сосредоточен на равенстве и даёт меньше способов доступа, чем B-tree.
- GIN является inverted index для multivalued content вроде arrays, full text и многих JSONB operators.
- GiST поддерживает расширяемые стратегии поиска, например geometry, ranges, nearest neighbor и некоторые text operations.
Зачем это спрашивают: Интервьюер оценивает, связывает ли кандидат методы доступа индекса с поддерживаемыми operator classes и query patterns.
Индекс наиболее привлекателен, когда предотвращает достаточно работы с таблицей для покрытия стоимости traversal и получения строк.
- Предикат, возвращающий малую долю строк, часто выигрывает от индекса.
- Для частого значения, возвращающего большинство строк, sequential scan может оказаться дешевле.
- Clustering, состояние cache, ширина строки и index-only coverage могут менять точку перехода.
- Статистика с учётом skew важна, потому что среднее число distinct values может неверно описывать частые и редкие значения.
Зачем это спрашивают: Сильный ответ рассматривает selectivity как часть cost decision, а не фиксированный порог.
Индекс может предоставлять подходящие ключи или полезный порядок, когда его ведущие столбцы соответствуют операции.
- Индекс по внешнему ключу может ускорить повторные inner lookups в nested-loop join.
- Упорядоченный доступ к индексу может убрать отдельную сортировку для совместимого ORDER BY.
- GROUP BY может использовать упорядоченный вход для grouped aggregation, хотя hash aggregate всё ещё может быть дешевле.
- Один индекс редко обслуживает все варианты filter, join и order, поэтому семьи запросов требуют явных приоритетов.
Зачем это спрашивают: Интервьюер проверяет понимание индексов как структур доступа и порядка для разных операторов плана.
Каждый индекс занимает место и добавляет работу при изменении данных, журналировании, кешировании и обслуживании.
- INSERT должен добавить записи во все подходящие индексы.
- UPDATE может менять индексированные ключи или инвалидировать версии, а DELETE оставляет cleanup work согласно СУБД.
- Случайные изменения страниц, page splits и накопившееся пустое пространство могут увеличивать write amplification.
- Избыточные индексы тратят ресурсы и могут перекрываться, не обслуживая отдельное ограничение или паттерн запроса.
Зачем это спрашивают: Сильный ответ описывает затраты write path и lifecycle, а не считает индексы бесплатным ускорением чтения.
Multiversion concurrency control позволяет транзакциям читать согласованные версии строк, пока другие транзакции меняют те же логические данные.
- Readers используют snapshot для определения видимых версий.
- Writers создают или ссылаются на новые версии вместо немедленной перезаписи версии, видимой всем readers.
- Это уменьшает reader-writer blocking, но не устраняет конфликты writers и все locks.
- Старые версии требуют cleanup или повторного использования после того, как ни одна relevant transaction их не видит.
Зачем это спрашивают: Интервьюер оценивает понимание snapshot visibility, версий и сохраняющейся необходимости locks и cleanup.
Snapshot транзакции определяет, какие зафиксированные и выполняющиеся изменения видны statement или транзакции.
- Он записывает visibility boundary из transaction identifiers или engine-specific version metadata.
- Read Committed обычно получает новый snapshot для каждого statement.
- Repeatable Read обычно сохраняет одно transaction-level view с учётом семантики СУБД.
- Долгоживущий snapshot может мешать освобождению старых версий строк.
Зачем это спрашивают: Сильный ответ связывает lifetime snapshot с семантикой изоляции и удержанием версий.
Закрытые вопросы
- 21
Зачем PostgreSQL нужен VACUUM в модели MVCC?
postgres - 22
Чем концептуально отличаются tuple versions PostgreSQL и undo records InnoDB?
postgres - 23
Как стандартные уровни изоляции транзакций связаны с аномалиями конкурентности?
transactionsconcurrency - 24
Как Read Committed обычно работает при MVCC?
- 25
Чем Repeatable Read отличается в PostgreSQL и MySQL InnoDB?
postgres - 26
Что гарантирует уровень изоляции Serializable?
serialization - 27
Чем отличаются dirty read, non-repeatable read, phantom read и lost update?
- 28
Что такое write skew при snapshot isolation?
snapshot - 29
Чем отличаются optimistic и pessimistic concurrency control?
lockingconcurrency - 30
Чем отличаются row-level и table-level locks?
- 31
Что делает SELECT FOR UPDATE?
- 32
Что такое deadlock в базе данных?
databaselocking - 33
Что такое intention locks?
- 34
Что такое партиционирование таблицы?
partitioning - 35
Чем отличаются range, list и hash partitioning?
partitioning - 36
Что такое partition pruning?
partitioning - 37
Каким должен быть хороший partition key?
partitioning - 38
Чем партиционирование отличается от шардинга?
shardingpartitioning - 39
Что такое физическая репликация?
replication - 40
Что такое логическая репликация?
replication - 41
Как синхронная и асинхронная репликация влияют на фиксацию транзакций?
replicationasync - 42
Какую роль WAL и binlog играют в репликации?
replication - 43
Что такое replication slot PostgreSQL?
postgresreplication - 44
Как стратегии полного, инкрементального и дифференциального бэкапа влияют на цепочки восстановления?
backups - 45
Как работает point-in-time recovery?
- 46
Чем отличаются хранимые процедуры и хранимые функции?
stored-procedures - 47
Что такое триггеры базы данных и какие компромиссы они добавляют?
database - 48
Зачем нужен connection pooling базы данных?
databasepooling - 49
Чем отличаются режимы session, transaction и statement pooling в PgBouncer?
transactionssessions - 50
Как prepared statements взаимодействуют с планированием запросов и connection pools?
queriespooling - 51
Запрос PostgreSQL замедлился после десятикратного роста таблицы. Как оптимизировать его по плану выполнения?
queriespostgres - 52
План PostgreSQL оценивает 100 строк, но возвращает миллион. Что вы будете исследовать?
estimationpostgres - 53
Большая таблица использует sequential scan, хотя на столбце фильтра есть index. Как это диагностировать?
indexesschemaaggregation - 54
Как спроектировать составной index для запроса с фильтрацией по tenant и status и сортировкой по created_at?
indexesqueriesdesign - 55
EXPLAIN ANALYZE показывает spill большой сортировки на диск. Как её оптимизировать?
optimization - 56
Hash join работает намного медленнее ожидаемого и использует несколько batches. Что делать?
joinsbatch - 57
Oracle-отчёт сменил hash join на nested loop и резко замедлился. Как это исследовать?
joins - 58
Один prepared statement PostgreSQL быстр для большинства параметров, но очень медленен для нескольких. Как это диагностировать?
postgres - 59
Запрос к partitioned table PostgreSQL сканирует все partitions. Как восстановить partition pruning?
queriespostgrespartitioning - 60
Ежедневная агрегация перегружает primary database на час. Как оптимизировать нагрузку?
databaseaggregationoptimization - 61
Пользователи сообщают о зависших updates. Как диагностировать цепочку блокировок PostgreSQL?
postgres - 62
Как анализировать и сокращать повторяющиеся deadlocks в базе данных?
databaselocking - 63
Много sessions находятся idle in transaction, и vacuum не очищает старые строки. Как исправить ситуацию?
transactionssessions - 64
Изменение схемы ждёт lock на занятой таблице. Как действовать безопасно?
schema - 65
Autovacuum работает, но таблица с частыми updates продолжает накапливать dead tuples. Как его настроить?
- 66
У базы есть свободный CPU, но приложения получают ошибки too many connections. Как это диагностировать?
database - 67
Как настроить PgBouncer для workloads с prepared statements и session settings?
sessionsconfig - 68
Storage растёт на 8 процентов в месяц. Как построить capacity plan?
capacity - 69
CPU базы приближается к 90 процентам в часы пик. Как выбрать между тюнингом и масштабированием?
databasescaling - 70
Как диагностировать memory pressure базы данных, вызывающее swapping или OOM kills?
databasememory - 71
Задержка растёт при низком CPU и насыщенных storage IOPS. Как действовать?
latency - 72
Число connections растёт быстрее трафика. Как прогнозировать и контролировать его?
- 73
Как установить actionable capacity alerts для production-базы?
databasecapacityalerting - 74
Как настроить pgBackRest для крупной PostgreSQL-базы с ограниченным backup window?
databasepostgresconfig - 75
Пользователь просит восстановить PostgreSQL на момент перед случайным удалением. Как безопасно выполнить PITR?
postgres - 76
Backups каждую ночь сообщают об успехе. Как доказать, что из них действительно можно восстановиться?
backups - 77
Бизнес требует RPO 15 минут и RTO два часа. Как перевести это в дизайн backup?
designbackups - 78
Полный restore многотерабайтной базы не укладывается в RTO. Как ускорить восстановление?
database - 79
Как подготовить восстановление базы после полного отказа cloud region?
database - 80
Как настроить streaming replication PostgreSQL для новой production standby?
postgresreplicationstreaming - 81
Replica PostgreSQL отстаёт на часы при исправной сети. Как диагностировать lag?
postgresreplication - 82
Как выбрать synchronous или asynchronous replication для PostgreSQL workload?
postgresreplicationasync - 83
Какие safeguards нужны до включения автоматического database failover?
database - 84
Как настроить HAProxy для маршрутизации database connections во время failover?
databaseconfig - 85
Failover AWS RDS или Aurora занимает дольше ожидаемого. Как его проанализировать и улучшить готовность?
health-checks - 86
MySQL replica остановилась с duplicate-key error. Как безопасно её восстановить?
replication - 87
Как добавить NOT NULL column с default в крупную занятую таблицу без downtime?
schemafundamentals - 88
Как создать index на крупной PostgreSQL-таблице без блокировки production writes?
indexespostgres - 89
Как изменить type часто используемого column, если прямой ALTER переписывает таблицу?
schema - 90
Backfill 500 миллионов строк вызывает replication lag и table bloat. Как его переработать?
replicationbackfill - 91
Как безопасно rename или remove database column, используемый несколькими версиями приложения?
databaseschema - 92
Как координировать многошаговую schema migration с deployment приложения?
schemamigrationsdeployment - 93
PostgreSQL-таблица намного больше живых данных. Как оценить и сократить table bloat?
postgres - 94
Как диагностировать bloat index PostgreSQL и решить, нужен ли rebuild?
indexespostgres - 95
Autovacuum settings подходят большинству таблиц, но не одной большой hot table. Как настроить её без вреда кластеру?
- 96
PostgreSQL приближается к защите от transaction ID wraparound. Как действовать?
databasetransactionspostgres - 97
MongoDB query замедляется с ростом collection. Как диагностировать и оптимизировать его?
queriesmongodboptimization - 98
Redis начинает evict keys, а latency растёт рядом с memory limit. Как восстановиться и предотвратить повтор?
latencymemoryredis - 99
CockroachDB показывает много transaction retries, а один range получает основную нагрузку. Как это исправить?
transactions - 100
Как подготовить monitoring и automation до запуска новой production database?
databasemonitoring