Skip to content

Вопросы на собеседовании: Администратор БД

100 реальных вопросов с образцовыми ответами и пояснениями для уровня Middle.

Смотреть пример резюме: Администратор БД

Тренировка флешкарточками

Интервальное повторение · Hunter Pass

Вопросы

sqldatabasequeries

База разбирает и проверяет 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 выполнения.

indexes

Эти пути доступа меняют startup cost, random access и массовое чтение страниц в зависимости от оценочной selectivity.

  • Sequential scan читает страницы таблицы и может быть эффективен, когда нужна большая её часть.
  • Index scan следует по подходящим записям индекса к строкам таблицы и подходит selective predicates.
  • Bitmap scan PostgreSQL сначала собирает расположение подходящих строк, затем посещает страницы таблицы более сгруппированно.
  • Оптимизатор выбирает по оценкам стоимости страниц, числа строк, нужного порядка и предположений cache.

Зачем это спрашивают: Интервьюер оценивает понимание того, почему индекс не всегда является самым дешёвым путём доступа.

joins

Три алгоритма join объединяют входы через повторный поиск, хеширование или упорядоченный проход.

  • Nested loop сканирует внутренний вход для каждой внешней строки и эффективен при малой внешней стороне и индексированном поиске внутри.
  • Hash join строит hash table из одного входа и проверяет её другим, обычно для соединений по равенству.
  • Merge join продвигается по двум входам, отсортированным по совместимым join keys, и эффективен для больших упорядоченных наборов.
  • Условие join, размеры входов, порядок сортировки, память и оценки определяют доступный и выгодный алгоритм.

Зачем это спрашивают: Сильный ответ связывает каждый алгоритм join со свойствами входов, а не ранжирует их универсально.

estimation

Cardinality estimates прогнозируют число строк, а cost estimates сравнивают ожидаемую работу ресурсов в специфичных для СУБД единицах.

  • Costs обычно объединяют моделируемый доступ к страницам, CPU processing, sorting и startup операторов.
  • Это относительные значения планирования, а не прямые миллисекунды.
  • Ошибка числа строк в начале плана может привести к неудачному алгоритму или порядку joins далее.
  • Фактические метрики выполнения сравнивают с оценками, чтобы понять, отражают ли статистика и предположения данные.

Зачем это спрашивают: Интервьюер проверяет, читает ли кандидат оценки как входы оптимизатора, а не буквальные обещания времени выполнения.

databasequeries

Планировщик использует сводные данные о распределении и размере таблиц для оценки 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 только по типу столбца.

sql

Sargable-предикат позволяет оптимизатору сопоставить условие поиска с упорядоченной или иначе доступной через индекс операцией.

  • Прямое сравнение индексированного столбца с совместимым значением обычно является sargable.
  • Функция вокруг столбца может помешать обычному индексу, если нет подходящего expression index.
  • Неявное преобразование типа на индексированной стороне тоже может заблокировать эффективный поиск.
  • Переписывание сначала сохраняет семантику запроса, потому что index-friendly выражение бесполезно при изменении результата.

Зачем это спрашивают: Интервьюер проверяет понимание влияния формы предиката на доступ к индексу без сведения оптимизации к синтаксическим трюкам.

Оптимизатор обычно переставляет и объединяет безопасные предикаты согласно плану, а не их текстовому порядку.

  • SQL описывает требуемый результат, а не императивную последовательность проверок строк.
  • Predicate pushdown может перемещать фильтры ближе к scans или ниже joins, когда семантика разрешает.
  • Volatile functions, outer joins и выражения с возможными ошибками могут ограничивать допустимые преобразования.
  • Производительность нужно оценивать по execution plan, а не выводить из порядка условий в тексте запроса.

Зачем это спрашивают: Сильный ответ понимает декларативный SQL и признаёт семантические ограничения преобразований оптимизатора.

indexes

Покрывающий индекс содержит все столбцы, необходимые запросу, позволяя СУБД избежать или сократить обращения к строкам таблицы.

  • Столбцы поиска и join образуют доступный для поиска ключ индекса.
  • Дополнительные выходные столбцы можно включить как non-key payload, если СУБД поддерживает INCLUDE.
  • Index-only scans PostgreSQL всё равно зависят от visibility information, определяющей возможность пропустить heap access.
  • Широкие индексы требуют больше storage и write bandwidth, поэтому покрытие должно соответствовать устойчивым частым формам запросов.

Зачем это спрашивают: Интервьюер оценивает понимание логического покрытия и engine-specific условий index-only access.

indexesschema

Порядок столбцов должен следовать условиям равенства, границам диапазона, join keys и нужной сортировке обслуживаемых запросов.

  • Ведущие столбцы равенства сужают доступный префикс до следующего столбца диапазона.
  • После неограниченного диапазона следующие столбцы могут фильтровать, но часто не могут так же эффективно сузить index scan.
  • ORDER BY может выиграть при совпадении последовательности и направления с используемым префиксом индекса.
  • Одна cardinality не является универсальным правилом, потому что полезность определяет полная форма предиката и сортировки.

Зачем это спрашивают: Сильный ответ применяет поведение leading prefix к структуре запроса вместо правила всегда ставить первым столбец с максимальной cardinality.

indexes

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

  • Индекс WHERE status = 'open' может обслуживать запросы к тому же подмножеству открытых строк.
  • Планировщик должен доказать, что предикат запроса подразумевает предикат индекса.
  • Частичные уникальные индексы могут обеспечивать уникальность только в подмножестве, например активных записей.
  • Они не подходят, когда запросам нужна большая часть исключённых строк или определение подмножества постоянно меняется.

Зачем это спрашивают: Интервьюер проверяет понимание логического следования предикатов и индексации или ограничений по подмножеству.

indexes

Индекс по выражению хранит результат детерминированного выражения, чтобы запросы с тем же выражением могли искать напрямую.

  • Индекс по lower(email) может поддерживать нормализованный по регистру поиск равенства с той же семантикой.
  • Выражение запроса должно достаточно точно совпадать с индексированным, чтобы планировщик его распознал.
  • Индексы по выражению также могут обеспечивать уникальность нормализованного представления.
  • Вычисление и поддержка выражения добавляют стоимость записи и связывают схему с формой запроса.

Зачем это спрашивают: Сильный ответ объясняет совпадение выражений, нормализованную уникальность и стоимость обслуживания.

indexespostgres

Тип индекса определяется оператором и паттерном доступа к данным, а не только типом столбца.

  • 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.

indexes

Индекс наиболее привлекателен, когда предотвращает достаточно работы с таблицей для покрытия стоимости traversal и получения строк.

  • Предикат, возвращающий малую долю строк, часто выигрывает от индекса.
  • Для частого значения, возвращающего большинство строк, sequential scan может оказаться дешевле.
  • Clustering, состояние cache, ширина строки и index-only coverage могут менять точку перехода.
  • Статистика с учётом skew важна, потому что среднее число distinct values может неверно описывать частые и редкие значения.

Зачем это спрашивают: Сильный ответ рассматривает selectivity как часть cost decision, а не фиксированный порог.

indexesjoinsaggregation

Индекс может предоставлять подходящие ключи или полезный порядок, когда его ведущие столбцы соответствуют операции.

  • Индекс по внешнему ключу может ускорить повторные inner lookups в nested-loop join.
  • Упорядоченный доступ к индексу может убрать отдельную сортировку для совместимого ORDER BY.
  • GROUP BY может использовать упорядоченный вход для grouped aggregation, хотя hash aggregate всё ещё может быть дешевле.
  • Один индекс редко обслуживает все варианты filter, join и order, поэтому семьи запросов требуют явных приоритетов.

Зачем это спрашивают: Интервьюер проверяет понимание индексов как структур доступа и порядка для разных операторов плана.

indexes

Каждый индекс занимает место и добавляет работу при изменении данных, журналировании, кешировании и обслуживании.

  • 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.

transactionssnapshot

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