Вопросы 71-80 для разработчиков
| OLTP (Online Transaction Processing) | OLAP (Online Analytical Processing) |
|---|---|
| Обрабатывает простые, частые транзакции | Обрабатывает сложные запросы и анализ данных |
| Оптимизирована для быстрого чтения и записи | Оптимизирована для read-heavy рабочих нагрузок и агрегации |
| Использует нормализованную схему для консистентности | Использует денормализованную схему (star/snowflake) |
| Пример: E-commerce, банковские системы | Пример: Data warehouse, Business Intelligence |
Две транзакции постоянно откатывают друг друга изменения в цикле, создавая бесконечный loop без блокировок.
Ответ: Dynamic SQL — это SQL код, создаваемый и выполняемый во время выполнения с использованием переменных или пользовательского ввода.
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;
| Горизонтальная партиция | Вертикальная партиция |
|---|---|
| Разделяет строки таблицы на основе значений столбца | Разделяет столбцы таблицы на отдельные части |
| Данные разделяются по строкам (одинаковые столбцы, разные строки) | Данные разделяются по столбцам (разные столбцы) |
| Улучшает производительность, снижая количество сканируемых строк | Улучшает производительность, разделяя часто и редко используемые данные |
| Пример: Таблица разделена по году или региону | Пример: Большие текстовые столбцы хранятся отдельно |
| Sharding | Partitioning |
|---|---|
| Разделяет БД на несколько независимых БД | Разделяет таблицу на части в одной БД |
| Используется для горизонтального масштабирования на серверах | Используется для лучшей производительности и управления данными |
| Данные хранятся на разных серверах | Данные остаются в одной БД |
| Пример: БД разделена по регионам | Пример: Таблица разделена по году |
-- ❌ НЕ ОПТИМАЛЬНО
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';
| Indexing (Индексирование) | Denormalization (Денормализация) |
|---|---|
| Улучшает производительность запросов, ускоряя поиск данных | Улучшает производительность чтения, снижая количество join операций |
| Не дублирует данные | Вводит избыточность данных |
| Замедляет операции insert, update и delete | Усложняет обновления из-за избыточных данных |
| Требует дополнительное место для индексов | Требует дополнительное место для дублированных данных |
Ответ: SQL использует рекурсивные CTEs для получения иерархических или tree-структурированных данных.
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;