🗄️ Вопросы интервью по SQL

Вопросы 71-80 для разработчиков

Вопрос SQL 71
В чем различие между системами OLTP и OLAP?
Сравнительная таблица:
OLTP (Online Transaction Processing) OLAP (Online Analytical Processing)
Обрабатывает простые, частые транзакции Обрабатывает сложные запросы и анализ данных
Оптимизирована для быстрого чтения и записи Оптимизирована для read-heavy рабочих нагрузок и агрегации
Использует нормализованную схему для консистентности Использует денормализованную схему (star/snowflake)
Пример: E-commerce, банковские системы Пример: Data warehouse, Business Intelligence
Основные характеристики:
  • OLTP: Множество небольших транзакций, быстрый ответ, актуальные данные
  • OLAP: Крупные аналитические запросы, исторические данные, сложный анализ
Вопрос SQL 72
Что такое live lock и чем он отличается от deadlock?
Live Lock:
  • Возникает когда две или более транзакции продолжают отвечать на изменения друг друга, но прогресса нет
  • В отличие от deadlock, транзакции не заблокированы; они активно работают, но не могут завершиться
  • Может быть вызван постоянными повторами операций
Deadlock:
  • Возникает когда две или более транзакции ждут друг друга, чтобы освободить ресурсы
  • Весь прогресс блокирован, ни одна транзакция не может продолжиться
  • Требуется терминирование одной из транзакций
Пример Live Lock:

Две транзакции постоянно откатывают друг друга изменения в цикле, создавая бесконечный loop без блокировок.

Вопрос SQL 73
Как реализовать динамический SQL и какие его преимущества и риски?

Ответ: Dynamic SQL — это SQL код, создаваемый и выполняемый во время выполнения с использованием переменных или пользовательского ввода.

Преимущества:
  • Строит гибкие запросы динамически
  • Полезно для динамической фильтрации, сортировки и выбора таблиц
Риски:
  • Уязвимость к SQL injection если входные данные не валидируются
  • Сложнее отлаживать и поддерживать
  • Может снизить производительность запроса из-за ограниченного переиспользования плана выполнения
Пример (SQL Server):

DECLARE @SQL NVARCHAR(MAX);
DECLARE @DeptID INT = 10;

SET @SQL = 'SELECT * FROM Employees WHERE DeptID = ' + CAST(@DeptID AS VARCHAR);
EXEC sp_executesql @SQL;

-- ✅ БЕЗОПАСНЫЙ способ с параметрами
SET @SQL = 'SELECT * FROM Employees WHERE DeptID = @DeptID';
EXEC sp_executesql @SQL, N'@DeptID INT', @DeptID;
                
Вопрос SQL 74
В чем разница между горизонтальной и вертикальной партицией?
Сравнительная таблица:
Горизонтальная партиция Вертикальная партиция
Разделяет строки таблицы на основе значений столбца Разделяет столбцы таблицы на отдельные части
Данные разделяются по строкам (одинаковые столбцы, разные строки) Данные разделяются по столбцам (разные столбцы)
Улучшает производительность, снижая количество сканируемых строк Улучшает производительность, разделяя часто и редко используемые данные
Пример: Таблица разделена по году или региону Пример: Большие текстовые столбцы хранятся отдельно
Вопрос SQL 75
Какие соображения при индексировании очень больших таблиц?
Ключевые соображения:
  • Индексируйте часто используемые столбцы: Создавайте индексы на столбцах, используемых в WHERE, JOIN и ORDER BY клаузах. Избегайте индексирования каждого столбца
  • Выбирайте правильный тип индекса: Используйте clustered индексы для первичных ключей и range запросов, non-clustered индексы для фильтрации и сортировки
  • Используйте партиционированные индексы: Создавайте локальные индексы для партиционированных таблиц для улучшения производительности
  • Поддерживайте индексы: Перестраивайте фрагментированные индексы и выполняйте обслуживание в непиковые часы
  • Мониторьте производительность: Анализируйте планы выполнения и удаляйте неиспользуемые индексы для снижения overhead
Вопрос SQL 76
В чем разница между sharding и partitioning базы данных?
Сравнительная таблица:
Sharding Partitioning
Разделяет БД на несколько независимых БД Разделяет таблицу на части в одной БД
Используется для горизонтального масштабирования на серверах Используется для лучшей производительности и управления данными
Данные хранятся на разных серверах Данные остаются в одной БД
Пример: БД разделена по регионам Пример: Таблица разделена по году
Вопрос SQL 77
Каковы лучшие практики при написании оптимизированных SQL запросов?
Лучшие практики:
  • Пишите простые запросы: Сохраняйте SQL запросы чистыми и избегайте ненужной сложности
  • Фильтруйте данные рано: Используйте WHERE клаузы для снижения количества обработанных данных
  • Избегайте SELECT *: Получайте только требуемые столбцы
  • Используйте индексы эффективно: Индексируйте часто используемые столбцы в WHERE, JOIN и ORDER BY клаузах
  • Анализируйте планы выполнения: Определяйте и исправляйте медленные операции
  • Оптимизируйте JOINы и агрегации: Используйте подходящие join и эффективные GROUP BY операции
  • Мониторьте производительность: Регулярно пересматривайте и настраивайте запросы по мере роста данных
Пример оптимизации:

-- ❌ НЕ ОПТИМАЛЬНО
SELECT * FROM Orders o
WHERE YEAR(o.OrderDate) = 2024;

-- ✅ ОПТИМАЛЬНО
SELECT o.OrderID, o.CustomerID, o.OrderDate
FROM Orders o
WHERE o.OrderDate >= '2024-01-01' AND o.OrderDate < '2025-01-01';
                
Вопрос SQL 78
Как мониторить производительность запросов в production БД?
Методы мониторинга:
  • Используйте планы выполнения: Определяйте bottlenecks и оптимизируйте производительность запросов
  • Анализируйте статистику ожидания: Обнаруживайте задержки, вызванные блокировками, I/O или использованием CPU
  • Используйте инструменты мониторинга: Используйте EXPLAIN, Query Store и Performance Schema для анализа запросов
  • Отслеживайте метрики производительности: Мониторьте время выполнения запроса, использование CPU и I/O для раннего обнаружения проблем
  • Постоянно настраивайте запросы: Оптимизируйте запросы и обновляйте индексы по мере роста данных и рабочих нагрузок
Основные инструменты:
  • SQL Server: Query Store, Extended Events, Execution Plans
  • MySQL: Performance Schema, Slow Query Log
  • PostgreSQL: pg_stat_statements, EXPLAIN ANALYZE
  • Oracle: AWR, SQL Tuning Advisor
Вопрос SQL 79
Каковы trade-offs при использовании индексов vs денормализации?
Сравнительная таблица:
Indexing (Индексирование) Denormalization (Денормализация)
Улучшает производительность запросов, ускоряя поиск данных Улучшает производительность чтения, снижая количество join операций
Не дублирует данные Вводит избыточность данных
Замедляет операции insert, update и delete Усложняет обновления из-за избыточных данных
Требует дополнительное место для индексов Требует дополнительное место для дублированных данных
Когда использовать:
  • Индексирование: Для оптимизации read-heavy рабочих нагрузок без потери консистентности
  • Денормализация: Для OLAP систем и хранилищ данных, где чтение является приоритетом
Вопрос SQL 80
Как SQL обрабатывает рекурсивные запросы?

Ответ: SQL использует рекурсивные CTEs для получения иерархических или tree-структурированных данных.

Синтаксис рекурсивного CTE:

WITH RecursiveCTE (ID, ParentID, Depth) AS (
    -- Anchor Query (базовый запрос)
    SELECT ID, ParentID, 1
    FROM Categories
    WHERE ParentID IS NULL
    
    UNION ALL
    
    -- Recursive Query (рекурсивный запрос)
    SELECT c.ID, c.ParentID, r.Depth + 1
    FROM Categories c
    JOIN RecursiveCTE r
    ON c.ParentID = r.ID
)
SELECT * FROM RecursiveCTE;
                
Компоненты:
  • Anchor Query: Базовый запрос, возвращающий начальные строки (обычно корневые элементы)
  • Recursive Query: Запрос, ссылающийся на CTE, возвращающий больше строк
  • UNION ALL: Объединяет результаты якоря и рекурсии
Варианты использования:
  • Иерархические данные (org charts, категории, структуры папок)
  • Деревья и графы
  • Поиск в глубину (DFS)