BA & SA | 10000 Interview questions – Telegram
BA & SA | 10000 Interview questions
8.65K subscribers
132 photos
7 videos
273 links
Вопросы и задачи, которые задают на собеседованиях на позицию Бизнес и Системного аналитика. По вопросам сотрудничества- @StarlinkGPT
Download Telegram
👩‍🏫Объяснение:
Отдельная схема в общей БД — классический и сбалансированный паттерн. Каждый тенант получает свои собственные таблицы в рамках своей схемы, что обеспечивает четкую логическую изоляцию и упрощает резервное копирование/восстановление данных для одного клиента. Это проще в администрировании, чем управление тысячами отдельных БД (B), и обеспечивает лучшую изоляцию и производительность, чем подход с единой таблицей (C), где ошибка в WHERE-условии может привести к утечке данных. Партиционирование (D) — это физическое разделение, но логически данные все еще в одной таблице, что не дает такой же чистоты изоляции.
№4668 категория вопросов: #DBMS
4668. В ленте новостей социальной сети запрос для получения постов друзей, начал выполняться медленно, несмотря на индексы. Анализ показал, что СУБД тратит 95% времени на сортировку огромного промежуточного результата перед LIMIT. Как это можно оптимизи
Anonymous Quiz
8%
Создать более селективный индекс по post_date DESC.
57%
Создать составной индекс, который включает все поля для фильтрации и сортировки в нужном порядке.
3%
Увеличить значение LIMIT для более точного планирования запроса.
32%
Разбить запрос на два: сначала получить ID постов подзапросом, затем основную информацию.
👩‍🏫Объяснение:
Ключевая проблема — сортировка по неиндексированному полю post_date после объединения таблиц. LIMIT применяется уже после сортировки всей выборки. Правильный составной индекс (например, на (user_id, friend_id, post_date DESC)) позволит СУБД выполнить «index scan» в уже отсортированном порядке, сразу отбирая топ-20 записей без ресурсоемкой операции filesort. Простой индекс на post_date (A) не поможет, так как сортировка происходит после JOIN. Разбиение запроса (D) иногда помогает, но радикальное решение — предоставить СУБД индекс, который сразу возвращает данные в нужном порядке.
№4669 категория вопросов: #DBMS
4669. Приложение для онлайн-тестирования должно записывать каждый ответ пользователя на вопрос. Транзакции частые, но не критичны к миллисекундной задержке. Как лучше управлять растущим объемом основной таблицы user_answers?
Anonymous Quiz
2%
Регулярно удалять старые данные (DELETE FROM ... WHERE created_at < ...).
69%
Использовать партиционирование таблицы по диапазону дат (например, по месяцам).
25%
Создать отдельную «историческую» БД и перемещать туда данные.
3%
Начать сжимать (COMPRESS) старые, редко используемые строки.
👩‍🏫Объяснение:
Партиционирование по диапазону — стандартное решение для управления жизненным циклом данных на основе времени. Оно позволяет:
* Быстро «отсекать» старые данные: удаление целой партиции (DROP PARTITION) — мгновенная операция, в отличие от тяжелого DELETE.
* Улучшать производительность запросов по актуальным данным: оптимизатор может читать только нужные партиции (партициональная прунинг).
* Упрощать архивацию: целую партицию можно выгрузить в архивный файл.
Удаление (A) нагружает БД и приводит к фрагментации. Отдельная БД (C) усложняет архитектуру. Сжатие строк (D) обычно встроено в СУБД и не решает проблему управления таблицей.
№4671 категория вопросов: #DBMS
4671. Для отчета необходимо быстро подсчитать общее количество уникальных активных пользователей за каждый день последнего месяца. Таблица user_sessions огромна. Какой индекс создаст максимально быстрый и компактный план запроса ?
Anonymous Quiz
3%
Индекс на (date).
34%
Индекс на (user_id, date).
43%
Индекс на (date, user_id).
20%
Отдельные индексы на date и на user_id.
👩‍🏫Объяснение:
Составной индекс (date, user_id) является покрывающим (covering) для этого конкретного запроса. В данном порядке:
1. date находится в начале, что позволяет эффективно отфильтровать данные по диапазону (WHERE).
2. user_id следует сразу за date, поэтому данные для каждой даты уже сгруппированы по user_id в индексе. Это позволяет СУБД выполнить «loose index scan» или, как минимум, читать только индекс (без обращения к таблице), быстро подсчитывая уникальных user_id для каждой даты. Индекс (user_id, date) (B) будет бесполезен для фильтрации по дате, а отдельные индексы (D) не обеспечат нужной группировки.
№4672 категория вопросов: #DBMS
4672. В унаследованной системе была таблица с полем category_id. Решили внедрить многоуровневую иерархию категорий. Как лучше расширить модель, чтобы эффективно отвечать на запросы «найти все товары в категории X и всех ее подкатегориях любого уровня»?
Anonymous Quiz
56%
Добавить рекурсивную связь: в таблицу categories добавить parent_id.
31%
Ввести дополнительную таблицу category_closure, которая хранит все пути в иерархии.
12%
Хранить путь (path) в виде строки с разделителями в самой категории, например, "1.5.12".
2%
Ограничиться фиксированной глубиной и добавить parent_id, grandparent_id и т.д.
👩‍🏫Объяснение:
Для работы с иерархическими данными произвольной глубины (деревьями) паттерн Closure Table (таблица замыканий) является одним из наиболее эффективных и универсальных. Таблица хранит все пары «предок-потомок», включая транзитивные связи. Это позволяет одним простым JOIN найти всех потомков категории, без рекурсивных запросов (которые могут быть медленными, вариант A) и без сложных строковых операций LIKE (вариант C). Вариант D не масштабируется и хрупок. Closure Table — это компромисс, позволяющий очень быстро читать иерархию ценой увеличения объема служебных данных и некоторой сложности при модификации дерева.
№4670 категория вопросов: #DBMS
👩‍🏫Объяснение:
Независимые логические атрибуты (аспекты статуса) лучше хранить в отдельных колонках. Это дает максимальную простоту и эффективность: фильтрация (WHERE status_legal = 'approved') и индексация по каждому аспекту тривиальны, целостность данных легко контролируется. Хранение в одной строке (A) делает запросы неэффективными. Связь многие-ко-многим (B) избыточна для простых атрибутов. JSONB (D) гибок, но сложнее в валидации и обычно медленнее для частой фильтрации. Подход C следует принципу «одна колонка — один атомарный факт».
№4673 категория вопросов: #DBMS
После обновления приложения в продекшене появилась ошибка, из-за которой в таблицу записывались платежи с нулевой суммой. Ошибку исправили. Как безопасно удалить ~10 000 некорректных записей из таблицы с 50 миллионами строк, не нарушая работу операций?
Anonymous Quiz
28%
Выполнить DELETE FROM payments WHERE amount = 0 AND created_at > ...
34%
Скопировать корректные данные во временную таблицу, сделать rename, пересоздать индексы в фоне.
32%
Пометить записи как удаленные, а физически удалить ночью.
6%
Использовать логическое удаление и фильтровать на уровне приложения.
👩‍🏫Объяснение:
На самом деле, для удаления 10к строк из 50 млн можно смело использовать осторожный DELETE с ограничением по времени (A), выполнив его в периоды низкой нагрузки, возможно, батчами (LIMIT 1000), чтобы не блокировать таблицу надолго. Однако, если бы речь шла об удалении миллионов строк, то вариант B (создание новой таблицы) был бы предпочтительнее, так как DELETE при огромном объеме — долгая, тяжелая операция, генерирующая много WAL-логов и потенциально блокирующая. Варианты C и D не очищают данные, а лишь маскируют проблему. В реалистичном кейсе с 10к записей правильнее A, но понимание альтернативы B для больших объемов — ключевое.
№4674 категория вопросов: #DBMS