Разработчик баз данных SQL (Профессиональный уровень)
Курс предназначен для слушателей, уже знакомых с основами SQL и работы с реляционными базами данных. Программа направлена на углубление знаний, развитие навыков проектирования, оптимизации запросов и практического применения SQL в профессиональной среде. Обучение включает теоретические модули, практикум по написанию сложных запросов, работу с транзакциями, триггерами, хранимыми процедурами и выполнение реального проекта.
Содержание курса
Модуль 1: Проектирование баз данных
- Нормализация и денормализация (1НФ–5НФ, Бойса–Кодда)
- Моделирование данных: ER-диаграммы
- Связи "один-ко-многим", "многие-ко-многим"
- Выбор подходящей архитектуры под задачу
- Практика: создание структуры БД для системы заказов или CRM
Модуль 2: Продвинутый SQL
- Подзапросы: скалярные, табличные, коррелированные
- Оконные функции: RANK(), ROW_NUMBER(), PARTITION BY
- CTE и рекурсивные CTE
- UNION, INTERSECT, EXCEPT
- CASE, COALESCE, NULLIF и другие конструкции
Модуль 3: Оптимизация производительности
- Анализ плана выполнения запросов (EXPLAIN)
- Работа с индексами: типы, использование, ограничения
- Настройка медленных запросов
- Использование партиционирования
- Примеры оптимизации: выборка из миллиона записей за секунду
Модуль 4: Хранимые процедуры и функции
- Создание процедур и функций
- Входные и выходные параметры
- Использование переменных и условий
- Обработка ошибок (TRY/CATCH)
- Триггеры: BEFORE, AFTER, INSTEAD OF
Модуль 5: Транзакции и целостность данных
- ACID-свойства
- BEGIN, COMMIT, ROLLBACK
- Уровни изоляции транзакций
- Блокировки и взаимодействие с параллельными процессами
- Практика: реализация банковской операции
Модуль 6: Безопасность и контроль доступа
- Роли и пользователи в СУБД
- GRANT и REVOKE привилегий
- Работа с VIEW как механизмом безопасности
- Шифрование данных, защита от SQL-инъекций
Модуль 7: Интеграция SQL с внешними системами
- Работа с JSON и XML
- Соединение SQL с Python/Java/Node.js
- Использование ORM: примеры на SQLAlchemy/Django ORM
- ETL-процессы: Extract, Transform, Load
Модуль 8: Проектная работа
- Разработка полноценной системы (CRM, интернет-магазин, библиотека)
- От проектирования до развертывания
- Реализация бизнес-логики через SQL
- Оптимизация запросов, тестирование, документирование
По окончании курса обучающиеся:
Должны уметь:
- Проектировать эффективные структуры баз данных
- Писать сложные SQL-запросы с использованием оконных функций, CTE, подзапросов
- Оптимизировать производительность запросов
- Создавать и использовать хранимые процедуры, триггеры, функции
- Управлять транзакциями и обеспечивать целостность данных
- Обеспечивать безопасность и контроль доступа к данным
- Интегрировать SQL с другими языками программирования и системами
Должны знать:
- Продвинутые возможности SQL
- Архитектурные принципы проектирования БД
- Механизмы работы индексов и планов запросов
- Особенности работы с большими объемами данных
- Принципы безопасности и управления пользователями
- Основы работы с ETL-процессами
Формат обучения
- Теоретические лекции + практические занятия
- Домашние задания с проверкой
- Мини-проекты после каждого модуля
- Финальный проект с презентацией
-
Что такое нормализация баз данных и какие нормальные формы вы знаете?
Нормализация — это процесс упорядочивания структуры таблиц с целью устранения избыточности и повышения целостности данных. Основные нормальные формы: 1НФ (отсутствие повторяющихся групп), 2НФ (полная зависимость от первичного ключа), 3НФ (отсутствие транзитивных зависимостей), Бойса-Кодда, 4НФ и 5НФ. -
В чём разница между CTE и подзапросом?
CTE (Common Table Expression) — это временная именованная таблица, определённая в рамках одного SQL-запроса. Подзапрос — это запрос внутри другого запроса, который может быть как именованным, так и анонимным. CTE делает запрос более читаемым и позволяет использовать рекурсию. -
Что такое оконные функции и для чего они используются?
Оконные функции выполняют вычисления по набору строк, связанных с текущей строкой. Они позволяют рассчитывать ранги, накопительные суммы, скользящие средние и другие аналитические метрики без потери уровня детализации. -
Как работает функция RANK() и чем она отличается от ROW_NUMBER()?
RANK() присваивает ранг строкам в порядке сортировки, оставляя пропуски при совпадении значений. ROW_NUMBER() присваивает уникальный номер каждой строке без пропусков. -
Что такое индекс и какие типы индексов существуют?
Индекс — это объект базы данных, предназначенный для ускорения выборки данных. Типы: B-Tree, Hash, Bitmap, Функциональные, Составные, Уникальные, Обратные. -
Как анализировать план выполнения запроса и зачем это нужно?
План выполнения запроса можно посмотреть с помощью команды EXPLAIN или EXPLAIN ANALYZE. Он показывает, как именно СУБД будет выполнять запрос: какие индексы используются, в каком порядке соединяются таблицы, сколько строк обрабатывается. -
Что такое транзакция и какие свойства она имеет?
Транзакция — это последовательность операций над базой данных, которая рассматривается как единое целое. Её свойства (ACID): Атомарность, Согласованность, Изолированность, Долговечность. -
В чём разница между READ COMMITTED и REPEATABLE READ в уровне изоляции транзакций?
READ COMMITTED гарантирует, что транзакция не увидит неподтверждённые изменения других транзакций. REPEATABLE READ обеспечивает, чтобы в рамках одной транзакции повторный запрос к данным возвращал те же значения. -
Что такое триггер и в каких случаях он применяется?
Триггер — это хранимая процедура, автоматически вызываемая при наступлении определённого события (INSERT, UPDATE, DELETE). Используется для логирования изменений, контроля целостности, автоматизации действий. -
Как создать хранимую процедуру и передать в неё параметры?
Хранимая процедура создаётся с помощью CREATE PROCEDURE, затем указываются входные/выходные параметры и тело процедуры. Пример:CREATE PROCEDURE get_user(IN id INT)
. -
Что такое курсор и когда его стоит использовать?
Курсор — это механизм работы с результатом запроса построчно. Используется в сложной бизнес-логике, когда требуется обработка записей по одной, но требует осторожности из-за снижения производительности. -
Что такое партиционирование и какие типы партиционирования существуют?
Партиционирование — это разделение большой таблицы на физически отдельные части для упрощения управления и повышения производительности. Типы: по диапазону, списку, хэшу, ключу. -
Как реализовать безопасность доступа к данным в SQL?
Безопасность реализуется через систему ролей и привилегий (GRANT / REVOKE), использование представлений, ограничение прав на уровне столбцов, шифрование, защиту от SQL-инъекций. -
Что такое VIEW и в чём его преимущества?
VIEW — это виртуальная таблица, основанная на результате SQL-запроса. Преимущества: абстракция, упрощение запросов, дополнительный уровень безопасности. -
Что такое ETL-процесс и как он связан с SQL?
ETL (Extract, Transform, Load) — это процесс извлечения, преобразования и загрузки данных. SQL используется на всех этапах: для извлечения, очистки, агрегации и записи данных в хранилища. -
Как работать с JSON в SQL?
В современных СУБД есть поддержка JSON. Например, в PostgreSQL — операторы ->, #>, функции jsonb_set(), jsonb_extract_path(). В MySQL — JSON_EXTRACT(), JSON_OBJECT(). -
Что такое материализованное представление и чем оно отличается от обычного?
Материализованное представление хранит данные физически и обновляется периодически. Обычное представление пересчитывается каждый раз при вызове. -
Что такое блокировка и какие виды блокировок бывают?
Блокировка — это механизм, предотвращающий одновременное изменение данных несколькими пользователями. Виды: разделяемые (shared), исключительные (exclusive), обновляемые (update). -
Как реализовать рекурсивный запрос с использованием CTE?
Рекурсивный CTE состоит из начального запроса и рекурсивной части. Пример:WITH RECURSIVE cte AS (SELECT ... UNION ALL SELECT ...) SELECT * FROM cte;
. -
Как защититься от SQL-инъекций?
SQL-инъекции можно предотвратить с помощью использования параметризованных запросов, подготовленных выражений, фильтрации и валидации ввода, использования ORM. -
Что такое миграция базы данных и как её организовать?
Миграция — это управляемое изменение структуры БД. Реализуется с помощью специальных инструментов (например, Alembic, Flyway, Django Migrations) и скриптов, где описаны upgrade и downgrade. -
Как интегрировать SQL с Python?
Интеграция осуществляется через драйверы (psycopg2, mysql-connector), ORM (SQLAlchemy, Django ORM) или пакеты pandas для работы с данными. -
Что такое deadlock и как с ним бороться?
Deadlock — это ситуация, когда две или более транзакций ожидают освобождения ресурсов друг от друга. Боротьба: минимизация времени блокировок, соблюдение порядка обращения к данным, настройка timeout. -
Что такое партиционированная таблица и как её создать?
Партиционированная таблица — это таблица, разделённая на несколько частей по определённому критерию. Создаётся с помощью PARTITION OF (в PostgreSQL) или PARTITION BY (в MySQL/Oracle). -
Что такое MVCC и как он влияет на работу с транзакциями?
MVCC (Multiversion Concurrency Control) — это механизм управления параллелизмом, позволяющий читать данные без блокировок. Каждая транзакция видит свою версию данных, что увеличивает производительность и устойчивость системы.
-
Что такое индекс на функции и когда его стоит использовать?
Индекс на функции (functional index) — это индекс, созданный на основе выражения или функции над столбцом. Применяется, когда запросы часто фильтруют данные с использованием определённой функции, например:CREATE INDEX idx_lower_name ON users (LOWER(name));
. -
Как работает оператор EXCEPT в SQL и каков его аналог в других языках?
EXCEPT возвращает строки из первого запроса, которых нет во втором. Аналогичен операции "разность множеств". В Python это можно реализовать через set difference. -
Что такое FULL OUTER JOIN и в каких случаях он применяется?
FULL OUTER JOIN возвращает все записи из обеих таблиц, объединяя их по условию. Если совпадений нет, поля одной из таблиц содержат NULL. Используется, когда важно не потерять данные ни из одной таблицы. -
Что такое поддержка ACID в транзакциях и почему она важна?
ACID — это набор свойств (Атомарность, Согласованность, Изолированность, Долговечность), обеспечивающих надёжную обработку транзакций. Поддержка ACID гарантирует корректное выполнение транзакций даже при сбоях. -
Как работает механизм блокировок уровня строк и уровня таблиц?
Блокировки уровня строк блокируют только конкретные строки, что позволяет другим транзакциям работать с другими строками. Блокировки уровня таблиц блокируют всю таблицу, ограничивая доступ ко всем её записям. -
Что такое сериализуемый уровень изоляции транзакций?
Serializable — самый строгий уровень изоляции, исключающий все возможные конфликты между параллельными транзакциями. Гарантирует, что транзакции выполняются так, как будто они последовательны. -
Как организовать автоматическое логирование изменений в таблице?
Это можно сделать с помощью триггеров, которые вызываются при INSERT, UPDATE или DELETE и записывают изменения в отдельную таблицу-лог. -
Что такое материализованное представление и как его обновить?
Материализованное представление хранит результат запроса физически. Обновляется вручную (REFRESH MATERIALIZED VIEW
) или автоматически по расписанию. -
Что такое партиционирование по диапазону и приведите пример его использования?
Партиционирование по диапазону делит данные на части по заданным интервалам значений. Например, по датам: одна партиция — январь-март, другая — апрель-июнь и т.д. -
Что такое шардинг баз данных и как он отличается от репликации?
Шардинг — это разделение базы данных на фрагменты, распределённые по разным серверам. Репликация — копирование данных с одного сервера на другой для отказоустойчивости и балансировки нагрузки. -
Как проверить производительность запроса в PostgreSQL?
В PostgreSQL используется командаEXPLAIN ANALYZE
, которая показывает план выполнения и реальное время исполнения запроса. -
Что такое deadlock и как его избежать?
Deadlock — это ситуация, когда две или более транзакций ожидают освобождения ресурсов друг от друга. Чтобы избежать, следует соблюдать порядок обращения к данным, уменьшать длительность транзакций и использовать таймауты. -
Какие типы соединений поддерживаются в SQL и какие из них самые эффективные?
INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN. INNER JOIN обычно самый эффективный, так как возвращает только совпадающие строки. -
Что такое UNION ALL и чем он отличается от UNION?
UNION ALL объединяет результаты двух запросов без удаления дубликатов. UNION удаляет дубликаты, что требует дополнительных вычислений. -
Что такое JSONB и чем он отличается от JSON в PostgreSQL?
JSONB хранит данные в двоичном формате, что обеспечивает более быстрое выполнение запросов. JSON хранится как текст и медленнее обрабатывается. -
Что такое хранимая процедура и как её вызвать?
Хранимая процедура — это объект БД, содержащий SQL-код, который можно вызывать по имени. Вызывается с помощьюCALL имя_процедуры(параметры);
. -
Как работает оператор INTERSECT и когда он используется?
INTERSECT возвращает пересечение двух наборов данных — те строки, которые есть и в первом, и во втором запросе. Используется для поиска общих записей. -
Что такое оптимизация запроса и какие методы оптимизации существуют?
Оптимизация запроса — это процесс улучшения производительности SQL-запросов. Методы: использование индексов, переформулировка запроса, денормализация, проектирование правильных структур данных. -
Что такое ORM и зачем она нужна?
ORM (Object-Relational Mapping) — это инструмент, позволяющий работать с данными в виде объектов, а не через SQL-запросы. Упрощает взаимодействие с БД и снижает риск SQL-инъекций. -
Как происходит работа с курсором в SQL и в каких случаях он полезен?
Курсор позволяет обрабатывать результаты запроса построчно. Полезен в сложной бизнес-логике, но может снизить производительность, поэтому его применение должно быть оправдано. -
Что такое миграция схемы БД и какие инструменты используются для этого?
Миграция схемы — это управляемое изменение структуры БД. Инструменты: Alembic, Flyway, Django Migrations, Liquibase. -
Что такое MVCC и как он реализован в PostgreSQL?
MVCC (Multiversion Concurrency Control) — это механизм управления версиями данных, позволяющий разным транзакциям видеть разные состояния БД. В PostgreSQL реализован через системные столбцы xmin и xmax. -
Как работает механизм VACUUM в PostgreSQL и зачем он нужен?
VACUUM очищает мёртвые версии строк и освобождает место для повторного использования. Необходим для поддержания высокой производительности и предотвращения роста размера БД. -
Что такое WAL и как он влияет на работу СУБД?
WAL (Write-Ahead Logging) — это журнал операций, в который записываются изменения перед тем, как они будут применены к самой БД. Нужен для восстановления после сбоев и обеспечения целостности. -
Что такое Sequence и как его использовать в SQL?
Sequence — это объект БД, генерирующий уникальные числа. Часто используется для автоинкремента. Создается командойCREATE SEQUENCE
и вызывается черезNEXTVAL()
илиCURRVAL()
.
-
Что такое индексированное представление и в каких СУБД оно используется?
Индексированное представление — это материализованное представление, для которого создаются индексы. Такой подход ускоряет выполнение запросов, основанных на этом представлении. Используется в Microsoft SQL Server. В других СУБД аналогичный эффект достигается через материализованные представления с индексами. -
Какие типы триггеров существуют и чем они отличаются?
Существует два типа триггеров:
- BEFORE — выполняется до изменения данных.
- AFTER — после изменения.
Также есть INSTEAD OF — вместо изменения. BEFORE часто используется для проверки или модификации данных перед вставкой/обновлением.
-
Что такое партиционирование по списку и приведите пример его использования?
Партиционирование по списку — это разделение таблицы на части по заданным значениям столбца. Например, можно разделить таблицу заказов по регионам: одна партиция — Москва, другая — Санкт-Петербург и т. д. -
Как работает механизм двухфазной коммит-транзакции (2PC)?
2PC (Two-phase commit) — протокол согласованности распределённых транзакций. Состоит из двух фаз:
- Фаза подготовки: координатор спрашивает участников, готовы ли они зафиксировать изменения.
- Фаза коммита: если все готовы, изменения фиксируются. Если кто-то не готов — откатывается вся транзакция.
-
Что такое оптимизатор запросов и как он влияет на производительность?
Оптимизатор запросов — это компонент СУБД, который анализирует возможные пути выполнения запроса и выбирает наиболее эффективный. От его работы зависит скорость и нагрузка на сервер при обработке сложных SQL-запросов. -
Что такое статистика таблицы и почему она важна для оптимизации?
Статистика содержит информацию о распределении данных в таблице (количество строк, уникальные значения, частота значений). Оптимизатор использует её для выбора наиболее эффективного плана выполнения запроса. -
Что такое операция ANALYZE в PostgreSQL и когда её стоит использовать?
ANALYZE собирает статистику по данным в таблицах, чтобы помочь оптимизатору выбрать правильный план запроса. Её стоит выполнять после массовых изменений данных, например, после импорта. -
Что такое индекс BRIN и в каких случаях он эффективен?
BRIN (Block Range Index) — это легковесный индекс, хранящий информацию о диапазонах значений в блоках данных. Эффективен для больших таблиц с упорядоченными данными, например, по дате или ID. -
Как работают частичные индексы и в чём их преимущество?
Частичный индекс создается не на всей таблице, а только на подмножестве строк, соответствующему условию WHERE. Преимущество — меньший размер и более высокая скорость поиска. -
Что такое оптимизация подзапросов и как она реализована в современных СУБД?
Оптимизация подзапросов — процесс преобразования вложенных запросов во внешние JOIN'ы или материализованные временные таблицы для повышения скорости выполнения. Современные СУБД автоматически применяют такие преобразования. -
Что такое параллелизм в БД и какие механизмы его реализации вы знаете?
Параллелизм — это возможность одновременного доступа к данным несколькими пользователями. Реализуется через блокировки, MVCC, уровни изоляции транзакций и другие механизмы. -
Какие ограничения накладывает использование JSON в индексах?
JSON-поля нельзя индексировать напрямую, но можно создать функциональный индекс на основе выражения, извлекающего значение из JSON. Также поддерживаются индексы GIN/GiST в PostgreSQL. -
Что такое шаблон проектирования "звезда" и где он применяется?
Шаблон "звезда" — это схема модели данных, в которой центральная факт-таблица окружена измерениями. Применяется в системах бизнес-аналитики и хранилищах данных. -
Что такое шаблон проектирования "снежинка" и как он связан со "звездой"?
"Снежинка" — это усложнённая версия "звезды", где измерения нормализуются и разбиваются на подчинённые таблицы. Позволяет экономить место, но может замедлить запросы. -
Что такое OLAP и как он связан с SQL?
OLAP (Online Analytical Processing) — это технологии анализа данных, позволяющие строить многомерные отчёты. SQL предоставляет средства для реализации OLAP-запросов через CUBE, ROLLUP, GROUPING SETS. -
Что такое индексированное представление и как его создать в SQL Server?
Индексированное представление — это представление, которое сохраняет свои данные в виде индекса. В SQL Server создается так: сначала создается обычное представление сWITH SCHEMABINDING
, затем на него добавляется кластерный индекс. -
Что такое оператор MERGE и в каких СУБД он поддерживается?
MERGE позволяет объединить логику INSERT, UPDATE и DELETE в одном запросе. Поддерживается в Oracle, SQL Server, PostgreSQL (как INSERT ON CONFLICT), MySQL (через специфику ON DUPLICATE KEY UPDATE). -
Что такое оптимизация через переписывание запроса и приведите пример?
Это метод изменения структуры запроса для улучшения производительности. Например, замена подзапроса на JOIN или упрощение условия WHERE. -
Что такое индексированный полнотекстовый поиск и как он реализован в SQL?
Полнотекстовый поиск позволяет находить слова в текстовых полях. Реализуется через специальные индексы (GIN/GiST в PostgreSQL, FULLTEXT в MySQL). -
Что такое гиперлоглог и как он используется в анализе данных?
HyperLogLog — это алгоритм подсчёта уникальных элементов с использованием минимальной памяти. В SQL реализуется через функции вроде HLL (в PostgreSQL), особенно полезен в Big Data. -
Что такое сканирование индекса и как оно отличается от сканирования таблицы?
Сканирование индекса — это чтение данных через индекс, что быстрее, чем сканирование всей таблицы (table scan), особенно при работе с большими объемами данных. -
Что такое оператор OFFSET и в чём его недостаток при пагинации?
OFFSET используется для пропуска N записей при пагинации. Недостаток — снижение производительности при больших значениях OFFSET, так как СУБД всё равно обрабатывает пропущенные строки. -
Что такое битовый индекс и в каких случаях он эффективен?
Битовый индекс хранит битовое значение для каждого уникального значения столбца. Эффективен для столбцов с малым количеством уникальных значений, например, пол, статус и т. д. -
Что такое оптимизация через партиционирование и как она влияет на запросы?
При использовании партиционирования СУБД может игнорировать те части таблицы, которые не попадают в область фильтрации, что ускоряет выполнение запроса. Это называется partition pruning. -
Что такое оператор EXPLAIN и как интерпретировать его вывод?
EXPLAIN показывает план выполнения запроса: какие индексы используются, какой порядок соединения таблиц, сколько строк ожидается обработать. Важно обращать внимание на типы соединений, стоимость и количество строк.
-
Какой тип нормализации устраняет транзитивные зависимости?
A) 1НФ
B) 2НФ
C) 3НФ
D) Бойса-Кодда
Правильный ответ: C) 3НФ -
Что такое CTE в SQL?
A) Подзапрос без имени
B) Временная именованная таблица, видимая только в текущем запросе
C) Хранимая процедура
D) Таблица с индексом
Правильный ответ: B) Временная именованная таблица, видимая только в текущем запросе -
Какую оконную функцию использовать для нумерации строк без пропусков?
A) RANK()
B) DENSE_RANK()
C) ROW_NUMBER()
D) NTILE()
Правильный ответ: C) ROW_NUMBER() -
Какой тип индекса наиболее эффективен для уникальных значений?
A) Хэш-индекс
B) B-Tree
C) Bitmap
D) Функциональный
Правильный ответ: B) B-Tree -
Какая команда используется для просмотра плана выполнения запроса?
A) ANALYZE
B) EXPLAIN
C) PLAN
D) DEBUG
Правильный ответ: B) EXPLAIN -
Какое свойство транзакций гарантирует её целостность при сбоях?
A) Атомарность
B) Согласованность
C) Изолированность
D) Долговечность
Правильный ответ: D) Долговечность -
Какой уровень изоляции транзакций может вызвать "грязное чтение"?
A) READ UNCOMMITTED
B) READ COMMITTED
C) REPEATABLE READ
D) SERIALIZABLE
Правильный ответ: A) READ UNCOMMITTED -
Что такое триггер BEFORE DELETE?
A) Выполняется после удаления строки
B) Выполняется перед удалением строки
C) Заменяет операцию удаления
D) Обновляет данные вместо удаления
Правильный ответ: B) Выполняется перед удалением строки -
Какая команда используется для создания хранимой процедуры?
A) CREATE FUNCTION
B) CREATE PROCEDURE
C) CREATE TRIGGER
D) CREATE VIEW
Правильный ответ: B) CREATE PROCEDURE -
Что означает MVCC в контексте работы СУБД?
A) Многопоточная обработка данных
B) Управление версиями данных
C) Механизм управления параллелизмом через версии
D) Многоуровневое шифрование
Правильный ответ: C) Механизм управления параллелизмом через версии -
Какой тип блокировки позволяет другим транзакциям читать данные, но не изменять их?
A) Разделяемая (Shared)
B) Исключительная (Exclusive)
C) Обновляемая (Update)
D) Сравнимая (Comparable)
Правильный ответ: A) Разделяемая (Shared) -
Какой уровень изоляции предотвращает "фантомное чтение"?
A) READ COMMITTED
B) REPEATABLE READ
C) SERIALIZABLE
D) READ UNCOMMITTED
Правильный ответ: C) SERIALIZABLE -
Что такое материализованное представление?
A) Представление, пересчитываемое каждый раз
B) Представление, хранящее данные физически
C) Представление, доступное только администраторам
D) Представление с функциональным индексом
Правильный ответ: B) Представление, хранящее данные физически -
Какой оператор используется для объединения двух наборов данных без удаления дубликатов?
A) UNION
B) INTERSECT
C) EXCEPT
D) UNION ALL
Правильный ответ: D) UNION ALL -
Какой тип партиционирования разделяет данные по списку допустимых значений?
A) По диапазону
B) По списку
C) По хэшу
D) По ключу
Правильный ответ: B) По списку -
Какой механизм используется для восстановления данных после сбоя?
A) WAL
B) VACUUM
C) ANALYZE
D) OPTIMIZE
Правильный ответ: A) WAL -
Что такое ORM?
A) Язык программирования
B) Инструмент для работы с интерфейсами
C) Объектно-реляционное отображение
D) Операционная система базы данных
Правильный ответ: C) Объектно-реляционное отображение -
Какой оператор используется для рекурсивных запросов?
A) WITH
B) WITH RECURSIVE
C) LOOP
D) WHILE
Правильный ответ: B) WITH RECURSIVE -
Какой тип JOIN возвращает все строки из обеих таблиц?
A) INNER JOIN
B) LEFT JOIN
C) RIGHT JOIN
D) FULL OUTER JOIN
Правильный ответ: D) FULL OUTER JOIN -
Какой индекс подходит для текстовых полей с большими объемами данных?
A) BRIN
B) GIN
C) HASH
D) BITMAP
Правильный ответ: B) GIN -
Что такое deadlock?
A) Ошибка запроса
B) Бесконечное ожидание между транзакциями
C) Откат транзакции
D) Повторяющаяся запись
Правильный ответ: B) Бесконечное ожидание между транзакциями -
Какой уровень изоляции транзакций используется по умолчанию в PostgreSQL?
A) READ UNCOMMITTED
B) READ COMMITTED
C) REPEATABLE READ
D) SERIALIZABLE
Правильный ответ: B) READ COMMITTED -
Что такое миграция базы данных?
A) Перенос на другой сервер
B) Создание резервной копии
C) Управляемое изменение структуры БД
D) Репликация данных
Правильный ответ: C) Управляемое изменение структуры БД -
Какой метод защиты от SQL-инъекций является наиболее надежным?
A) Использование LIMIT
B) Прямые запросы
C) Параметризованные запросы
D) Удаление пробелов
Правильный ответ: C) Параметризованные запросы -
Какая команда используется для обновления материализованного представления?
A) REFRESH MATERIALIZED VIEW
B) UPDATE VIEW
C) REBUILD VIEW
D) RESET VIEW
Правильный ответ: A) REFRESH MATERIALIZED VIEW
-
Какой тип нормализации устраняет транзитивные зависимости?
A) 1НФ
B) 2НФ
C) 3НФ
D) Бойса-Кодда
Правильный ответ: C) 3НФ -
Что такое CTE в SQL?
A) Подзапрос без имени
B) Временная именованная таблица, видимая только в текущем запросе
C) Хранимая процедура
D) Таблица с индексом
Правильный ответ: B) Временная именованная таблица, видимая только в текущем запросе -
Какую оконную функцию использовать для нумерации строк без пропусков?
A) RANK()
B) DENSE_RANK()
C) ROW_NUMBER()
D) NTILE()
Правильный ответ: C) ROW_NUMBER() -
Какой тип индекса наиболее эффективен для уникальных значений?
A) Хэш-индекс
B) B-Tree
C) Bitmap
D) Функциональный
Правильный ответ: B) B-Tree -
Какая команда используется для просмотра плана выполнения запроса?
A) ANALYZE
B) EXPLAIN
C) PLAN
D) DEBUG
Правильный ответ: B) EXPLAIN -
Какое свойство транзакций гарантирует её целостность при сбоях?
A) Атомарность
B) Согласованность
C) Изолированность
D) Долговечность
Правильный ответ: D) Долговечность -
Какой уровень изоляции транзакций может вызвать "грязное чтение"?
A) READ UNCOMMITTED
B) READ COMMITTED
C) REPEATABLE READ
D) SERIALIZABLE
Правильный ответ: A) READ UNCOMMITTED -
Что такое триггер BEFORE DELETE?
A) Выполняется после удаления строки
B) Выполняется перед удалением строки
C) Заменяет операцию удаления
D) Обновляет данные вместо удаления
Правильный ответ: B) Выполняется перед удалением строки -
Какая команда используется для создания хранимой процедуры?
A) CREATE FUNCTION
B) CREATE PROCEDURE
C) CREATE TRIGGER
D) CREATE VIEW
Правильный ответ: B) CREATE PROCEDURE -
Что означает MVCC в контексте работы СУБД?
A) Многопоточная обработка данных
B) Управление версиями данных
C) Механизм управления параллелизмом через версии
D) Многоуровневое шифрование
Правильный ответ: C) Механизм управления параллелизмом через версии -
Какой тип блокировки позволяет другим транзакциям читать данные, но не изменять их?
A) Разделяемая (Shared)
B) Исключительная (Exclusive)
C) Обновляемая (Update)
D) Сравнимая (Comparable)
Правильный ответ: A) Разделяемая (Shared) -
Какой уровень изоляции предотвращает "фантомное чтение"?
A) READ COMMITTED
B) REPEATABLE READ
C) SERIALIZABLE
D) READ UNCOMMITTED
Правильный ответ: C) SERIALIZABLE -
Что такое материализованное представление?
A) Представление, пересчитываемое каждый раз
B) Представление, хранящее данные физически
C) Представление, доступное только администраторам
D) Представление с функциональным индексом
Правильный ответ: B) Представление, хранящее данные физически -
Какой оператор используется для объединения двух наборов данных без удаления дубликатов?
A) UNION
B) INTERSECT
C) EXCEPT
D) UNION ALL
Правильный ответ: D) UNION ALL -
Какой тип партиционирования разделяет данные по списку допустимых значений?
A) По диапазону
B) По списку
C) По хэшу
D) По ключу
Правильный ответ: B) По списку -
Какой механизм используется для восстановления данных после сбоя?
A) WAL
B) VACUUM
C) ANALYZE
D) OPTIMIZE
Правильный ответ: A) WAL -
Что такое ORM?
A) Язык программирования
B) Инструмент для работы с интерфейсами
C) Объектно-реляционное отображение
D) Операционная система базы данных
Правильный ответ: C) Объектно-реляционное отображение -
Какой оператор используется для рекурсивных запросов?
A) WITH
B) WITH RECURSIVE
C) LOOP
D) WHILE
Правильный ответ: B) WITH RECURSIVE -
Какой тип JOIN возвращает все строки из обеих таблиц?
A) INNER JOIN
B) LEFT JOIN
C) RIGHT JOIN
D) FULL OUTER JOIN
Правильный ответ: D) FULL OUTER JOIN -
Какой индекс подходит для текстовых полей с большими объемами данных?
A) BRIN
B) GIN
C) HASH
D) BITMAP
Правильный ответ: B) GIN -
Что такое deadlock?
A) Ошибка запроса
B) Бесконечное ожидание между транзакциями
C) Откат транзакции
D) Повторяющаяся запись
Правильный ответ: B) Бесконечное ожидание между транзакциями -
Какой уровень изоляции транзакций используется по умолчанию в PostgreSQL?
A) READ UNCOMMITTED
B) READ COMMITTED
C) REPEATABLE READ
D) SERIALIZABLE
Правильный ответ: B) READ COMMITTED -
Что такое миграция базы данных?
A) Перенос на другой сервер
B) Создание резервной копии
C) Управляемое изменение структуры БД
D) Репликация данных
Правильный ответ: C) Управляемое изменение структуры БД -
Какой метод защиты от SQL-инъекций является наиболее надежным?
A) Использование LIMIT
B) Прямые запросы
C) Параметризованные запросы
D) Удаление пробелов
Правильный ответ: C) Параметризованные запросы -
Какая команда используется для обновления материализованного представления?
A) REFRESH MATERIALIZED VIEW
B) UPDATE VIEW
C) REBUILD VIEW
D) RESET VIEW
Правильный ответ: A) REFRESH MATERIALIZED VIEW
Экзаменационный билет №1
Теоретическая часть
- Что такое оконные функции и как они применяются в аналитических запросах?
- Охарактеризуйте механизм работы MVCC в PostgreSQL.
Ответы на теоретическую часть:
- Оконные функции — это функции, которые выполняют вычисления по набору строк, связанных с текущей строкой. Они позволяют выполнять агрегацию, ранжирование и сравнение без потери уровня детализации. Примеры:
ROW_NUMBER()
,RANK()
,LEAD()
,LAG()
. - MVCC (Multiversion Concurrency Control) — это механизм управления параллелизмом, при котором каждая транзакция видит свою версию данных. Это позволяет избежать блокировок при чтении и обеспечивает высокую производительность.
Практическая часть
Напишите SQL-запрос, который выводит имя сотрудника, его зарплату и разницу между его зарплатой и средней зарплатой по отделу.
SELECT
name,
salary,
salary - AVG(salary) OVER(PARTITION BY department_id) AS diff_from_avg
FROM employees;
Экзаменационный билет №2
Теоретическая часть
- Что такое CTE и в чём его преимущества перед подзапросами?
- Какие типы индексов вы знаете и в каких случаях их стоит использовать?
Ответы на теоретическую часть:
- CTE (Common Table Expression) — это временная именованная таблица, доступная только в рамках одного SQL-запроса. Преимущества: читаемость, возможность рекурсии, повторное использование в запросе.
- Типы индексов:
- B-Tree — для уникальных значений и диапазонных запросов
- Hash — для точного поиска
- GIN/GiST — для JSON, массивов
- BRIN — для упорядоченных больших данных
- Bitmap — для столбцов с малым количеством уникальных значений
Практическая часть
Создайте материализованное представление mv_avg_salary_by_dept
, которое хранит среднюю зарплату по каждому отделу. Добавьте команду обновления представления.
CREATE MATERIALIZED VIEW mv_avg_salary_by_dept AS
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;
-- Обновление материализованного представления
REFRESH MATERIALIZED VIEW mv_avg_salary_by_dept;
Экзаменационный билет №3
Теоретическая часть
- В чём разница между OLTP и OLAP системами?
- Что такое партиционирование и какие его виды вы знаете?
Ответы на теоретическую часть:
- OLTP (Online Transaction Processing) — системы, ориентированные на обработку множества коротких транзакций (вставка, обновление, удаление). OLAP (Online Analytical Processing) — системы, предназначенные для анализа больших объемов данных.
- Партиционирование — разделение таблицы на физически отдельные части. Виды: по диапазону (
RANGE
), списку (LIST
), хэшу (HASH
), ключу (KEY
).
Практическая часть
Напишите рекурсивный CTE, который строит иерархию менеджеров для сотрудников (предполагается, что у каждого сотрудника есть manager_id
).
WITH RECURSIVE hierarchy AS (
SELECT employee_id, name, manager_id, 1 AS level
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.employee_id, e.name, e.manager_id, h.level + 1
FROM employees e
INNER JOIN hierarchy h ON e.manager_id = h.employee_id
)
SELECT * FROM hierarchy;
Экзаменационный билет №4
Теоретическая часть
- Что такое сериализуемый уровень изоляции транзакций и когда он используется?
- Что такое триггер BEFORE INSERT и как его можно применить?
Ответы на теоретическую часть:
- Сериализуемый уровень — самый строгий, гарантирует, что транзакции будут выглядеть как последовательно выполненные. Используется в системах, где критически важна целостность данных.
- BEFORE INSERT — триггер, запускающийся до вставки записи. Может использоваться для проверки данных или автоматического заполнения полей (например, поля created_at).
Практическая часть
Создайте хранимую процедуру add_employee
, которая добавляет нового сотрудника и записывает событие в таблицу логов employee_logs
.
CREATE OR REPLACE PROCEDURE add_employee(
p_name VARCHAR,
p_salary NUMERIC
)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO employees (name, salary)
VALUES (p_name, p_salary);
INSERT INTO employee_logs (action, action_time)
VALUES ('Employee added', NOW());
END;
$$;
Экзаменационный билет №5
Теоретическая часть
- Что такое миграция схемы БД и какие инструменты для этого используются?
- Что такое deadlock и как с ним бороться?
Ответы на теоретическую часть:
- Миграция схемы — это управляемое изменение структуры БД. Инструменты: Alembic, Django Migrations, Flyway, Liquibase.
- Deadlock — это ситуация, когда две или более транзакций ожидают освобождения ресурсов друг от друга. Борьба: соблюдение порядка обращения к данным, установка timeout, минимизация длительности транзакций.
Практическая часть
У вас есть таблица orders
и customers
. Напишите SQL-запрос, который выводит количество заказов на клиента за последние 30 дней, используя оконную функцию.
SELECT
c.customer_id,
COUNT(o.order_id) OVER(PARTITION BY c.customer_id) AS order_count
FROM customers c
LEFT JOIN orders o
ON c.customer_id = o.customer_id AND o.order_date >= CURRENT_DATE - INTERVAL '30 days';
Экзаменационный билет №6
Теоретическая часть
- Что такое оптимизатор запросов и как он влияет на производительность?
- В чём разница между материализованным представлением и обычным VIEW?
Ответы на теоретическую часть:
- Оптимизатор запросов — это компонент СУБД, который анализирует возможные пути выполнения SQL-запроса и выбирает наиболее эффективный на основе статистики и доступных индексов. От его работы зависит скорость и нагрузка на сервер.
- Обычное
VIEW
пересчитывается каждый раз при вызове. Материализованное представление (MATERIALIZED VIEW
) хранит результат физически и обновляется по запросу или по расписанию.
Практическая часть
Используя оконные функции, выведите список сотрудников с их зарплатой и рангом в зависимости от зарплаты внутри каждого отдела (по убыванию).
SELECT
employee_id,
name,
department_id,
salary,
RANK() OVER(PARTITION BY department_id ORDER BY salary DESC) AS salary_rank
FROM employees;
Экзаменационный билет №7
Теоретическая часть
- Что такое уровень изоляции транзакций SERIALIZABLE и в чём его особенности?
- Что такое частичный индекс и когда он полезен?
Ответы на теоретическую часть:
- Уровень SERIALIZABLE — самый строгий уровень изоляции, исключающий все возможные конфликты между параллельными транзакциями. Используется редко из-за высоких накладных расходов.
- Частичный индекс — это индекс, созданный не на всей таблице, а только на подмножестве строк, соответствующем условию WHERE. Полезен, если часто запрашиваются только определённые данные.
Практическая часть
Создайте частичный индекс для таблицы orders
, чтобы ускорить выборку заказов со статусом 'completed'.
CREATE INDEX idx_orders_completed ON orders(order_id)
WHERE status = 'completed';
Экзаменационный билет №8
Теоретическая часть
- Что такое блокировки уровня строк и уровня таблиц?
- Какие механизмы контроля целостности данных вы знаете?
Ответы на теоретическую часть:
- Блокировка уровня строк блокирует только конкретные строки, что позволяет другим транзакциям работать с другими строками. Блокировка уровня таблиц блокирует всю таблицу, ограничивая доступ ко всем её записям.
- Механизмы: внешние ключи, триггеры, CHECK-ограничения, транзакции, каскадные удаления/обновления.
Практическая часть
Напишите SQL-запрос, который выводит для каждого пользователя количество его заказов за последний месяц.
SELECT
user_id,
COUNT(*) AS order_count
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '1 month'
GROUP BY user_id;
Экзаменационный билет №9
Теоретическая часть
- Что такое WAL и как он используется в PostgreSQL?
- Что такое шардинг и как он отличается от репликации?
Ответы на теоретическую часть:
- WAL (Write-Ahead Logging) — журнал операций, в который записываются изменения до того, как они будут применены к самой БД. Используется для восстановления после сбоев и обеспечения целостности.
- Шардинг — разделение базы данных на фрагменты, распределённые по разным серверам. Репликация — копирование данных с одного сервера на другой для отказоустойчивости и балансировки нагрузки.
Практическая часть
Напишите SQL-запрос, который выводит среднюю зарплату по каждому отделу и разницу с общей средней зарплатой.
SELECT
department_id,
AVG(salary) AS avg_salary,
AVG(salary) - (SELECT AVG(salary) FROM employees) AS diff_from_global_avg
FROM employees
GROUP BY department_id;
Экзаменационный билет №10
Теоретическая часть
- Что такое ORM и какие преимущества она даёт?
- Как работает механизм двухфазного коммита (2PC)?
Ответы на теоретическую часть:
- ORM (Object-Relational Mapping) — это слой абстракции, позволяющий работать с данными через объекты, а не напрямую через SQL. Преимущества: упрощение кода, защита от SQL-инъекций, автоматическое управление миграциями.
- 2PC (Two-phase Commit) — протокол согласованности распределённых транзакций. Состоит из двух фаз: подготовка (все участники готовы?) и коммит (фиксация изменений, если все готовы).
Практическая часть
Создайте хранимую процедуру log_transaction
, которая принимает параметры user_id
и action_type
, и добавляет запись в таблицу activity_log
.
CREATE OR REPLACE PROCEDURE log_transaction(
p_user_id INT,
p_action_type VARCHAR
)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO activity_log (user_id, action_type, timestamp)
VALUES (p_user_id, p_action_type, NOW());
END;
$$;
Экзаменационный билет №11
Теоретическая часть
- Что такое индекс на функции и когда его стоит использовать?
- Какие типы триггеров существуют и в чём их отличие?
Ответы на теоретическую часть:
- Индекс на функции создаётся на основе выражения или функции, например
LOWER(name)
. Используется, если часто фильтруют данные с использованием этой функции. - Триггеры бывают:
- BEFORE INSERT/UPDATE/DELETE — выполняются до изменения данных
- AFTER INSERT/UPDATE/DELETE — после
- INSTEAD OF — вместо операции
Практическая часть
Создайте функцию get_avg_salary
, которая возвращает среднюю зарплату сотрудников по указанному отделу.
CREATE OR REPLACE FUNCTION get_avg_salary(dept_id INT)
RETURNS NUMERIC AS $$
BEGIN
RETURN (
SELECT AVG(salary)
FROM employees
WHERE department_id = dept_id
);
END;
$$ LANGUAGE plpgsql;
Экзаменационный билет №12
Теоретическая часть
- В чём разница между
EXPLAIN
иEXPLAIN ANALYZE
? - Что такое PIVOT и UNPIVOT в SQL?
Ответы на теоретическую часть:
EXPLAIN
показывает план выполнения запроса, но не выполняет сам запрос.EXPLAIN ANALYZE
— выполняет запрос и выводит реальное время выполнения и информацию о каждом шаге.PIVOT
преобразует строки в столбцы, аUNPIVOT
— наоборот, столбцы в строки. Используются при анализе и преобразовании данных.
Практическая часть
Напишите SQL-запрос, который выводит план выполнения следующего запроса и объясняет, какие индексы могут помочь ускорить его работу.
EXPLAIN ANALYZE
SELECT *
FROM orders
WHERE customer_id = 100 AND status = 'completed';
Возможный ответ:
Если нет индекса на (customer_id, status) — СУБД будет выполнять full scan таблицы. Для оптимизации можно создать составной индекс:
CREATE INDEX idx_orders_customer_status ON orders(customer_id, status);
Экзаменационный билет №13
Теоретическая часть
- Что такое сериализация транзакций и как она влияет на производительность?
- Что такое BRIN-индекс и в каких случаях он эффективен?
Ответы на теоретическую часть:
- SERIALIZABLE — самый строгий уровень изоляции транзакций. Гарантирует последовательное выполнение, но может снижать производительность из-за частых откатов и конфликтов.
- BRIN (Block Range Index) хранит диапазоны значений блоков. Эффективен для больших таблиц с упорядоченными данными, например, по дате или ID.
Практическая часть
Напишите SQL-запрос, который выведет количество заказов за каждый месяц текущего года.
SELECT
DATE_TRUNC('month', order_date) AS month,
COUNT(*) AS total_orders
FROM orders
WHERE EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM CURRENT_DATE)
GROUP BY DATE_TRUNC('month', order_date)
ORDER BY month;
Экзаменационный билет №14
Теоретическая часть
- Что такое deadlock и как его избежать?
- Что такое гиперлоглог и где он используется?
Ответы на теоретическую часть:
- Deadlock — это ситуация, когда две или более транзакций ожидают освобождения ресурсов друг от друга. Чтобы избежать, соблюдайте порядок обращения к данным, минимизируйте длительность транзакций, используйте timeout.
- HyperLogLog — это алгоритм подсчёта уникальных элементов с минимальным использованием памяти. Используется в Big Data системах и реализован в PostgreSQL как
HLL
Практическая часть
Напишите SQL-запрос, который найдёт пользователей, у которых было больше 5 заказов за последние 30 дней.
SELECT user_id
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY user_id
HAVING COUNT(*) > 5;
Экзаменационный билет №15
Теоретическая часть
- Что такое VACUUM в PostgreSQL и зачем он нужен?
- Что такое OLAP и какие SQL-конструкции используются для аналитики?
Ответы на теоретическую часть:
- VACUUM очищает мёртвые версии строк и освобождает место для повторного использования. Необходим для поддержания высокой производительности и предотвращения роста размера БД.
- OLAP — системы многомерного анализа данных. Используются такие конструкции, как оконные функции (
RANK()
,ROW_NUMBER()
),CUBE
,ROLLUP
,GROUPING SETS
.
Практическая часть
Создайте рекурсивный CTE, который строит иерархию категорий товаров, где каждая категория имеет ссылку на родительскую.
WITH RECURSIVE category_tree AS (
SELECT category_id, name, parent_id, name AS path
FROM categories
WHERE parent_id IS NULL
UNION ALL
SELECT c.category_id, c.name, c.parent_id, ct.path || ' -> ' || c.name
FROM categories c
INNER JOIN category_tree ct ON c.parent_id = ct.category_id
)
SELECT * FROM category_tree;
Кейс №1: "Проблема с медленной аналитикой в онлайн-магазине"
Описание ситуации
Вы работаете SQL-разработчиком в компании, управляющей крупным онлайн-магазином. На платформе ежедневно обрабатывается более 100 000 заказов. Недавно бизнес-аналитики пожаловались, что запросы на получение отчётов по продажам стали выполняться слишком долго — иногда до нескольких минут.
Вам поручено разобраться в причинах низкой производительности и предложить решения для ускорения работы аналитических запросов.
Доступные данные
Таблица orders
Таблица products
Таблица customers
Запрос, вызывающий проблемы
Аналитики часто используют следующий запрос:
SELECT
p.category,
COUNT(o.order_id) AS total_orders,
SUM(o.quantity * o.price) AS total_revenue
FROM orders o
JOIN products p ON o.product_id = p.product_id
WHERE o.status = 'completed'
GROUP BY p.category
ORDER BY total_revenue DESC;
Этот запрос должен показывать выручку по категориям товаров за всё время. Однако он стал работать слишком медленно.
Скрытые проблемы
-
Отсутствие индексов:
В таблицеorders
нет индекса на полеstatus
, из-за чего фильтрация выполняется через full scan. -
Несоответствующая структура данных:
Запрос использует операциюquantity * price
на лету, вместо того чтобы хранить это значение или рассчитывать его при вставке. -
Большое количество строк в таблицах:
Таблицаorders
содержит более 10 миллионов записей. Без оптимизации каждое соединение и группировка занимают много времени. -
Частое использование JOIN без ограничений:
JOIN междуorders
иproducts
не имеет фильтров, что увеличивает объём обрабатываемых данных. -
Нет агрегированных представлений:
Нет материализованных представлений или промежуточных таблиц для хранения результатов часто используемых агрегаций.
Предложенные решения
1. Добавление индексов
CREATE INDEX idx_orders_status ON orders(status);
CREATE INDEX idx_orders_product_id ON orders(product_id);
CREATE INDEX idx_products_id_category ON products(product_id, category);
2. Хранение вычисленного значения
ALTER TABLE orders ADD COLUMN total_price NUMERIC;
-- Обновление существующих записей
UPDATE orders SET total_price = quantity * price;
-- Или создание триггера для новых записей
CREATE OR REPLACE FUNCTION calculate_total_price()
RETURNS TRIGGER AS $$
BEGIN
NEW.total_price := NEW.quantity * NEW.price;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_calculate_total_price
BEFORE INSERT ON orders
FOR EACH ROW
EXECUTE FUNCTION calculate_total_price();
3. Создание материализованного представления
CREATE MATERIALIZED VIEW sales_by_category AS
SELECT
p.category,
COUNT(o.order_id) AS total_orders,
SUM(o.total_price) AS total_revenue
FROM orders o
JOIN products p ON o.product_id = p.product_id
WHERE o.status = 'completed'
GROUP BY p.category;
-- Обновление представления (вручную или по расписанию)
REFRESH MATERIALIZED VIEW sales_by_category;
4. Партиционирование таблицы orders
Таблицу можно разделить по дате (order_date) — например, на партиции по месяцам:
CREATE TABLE orders_2025_03 PARTITION OF orders
FOR VALUES IN ('2025-03-01', '2025-03-31');
Обучающие моменты
- Работа с большими объемами данных требует проектирования индексов.
- Вычисления на лету могут замедлять работу запросов — лучше их предварительно сохранять.
- Материализованные представления помогают ускорить выполнение часто используемых сложных запросов.
- Партиционирование позволяет ускорить выборку данных по определённому критерию.
- Производительность зависит не только от самого SQL-запроса, но и от структуры БД и её настройки.
Кейс №2: "Ошибка в транзакции перевода средств между счетами"
Описание ситуации
Вы работаете в IT-отделе небольшого банка, где недавно внедрили систему перевода средств между клиентскими счетами. Клиенты начали жаловаться, что при переводе денег:
- Средства списываются с одного счёта, но не зачисляются на другой.
- Иногда деньги зачисляются дважды.
- В отдельных случаях система выдаёт ошибку, но деньги всё равно списываются.
Вам поручено разобраться с проблемой, найти источник ошибки и предложить исправление с учётом принципов ACID.
Доступные данные
Таблица accounts
Процедура перевода (реализована как хранимая процедура)
CREATE OR REPLACE PROCEDURE transfer_funds(
source_account INT,
target_account INT,
amount NUMERIC
)
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE accounts SET balance = balance - amount WHERE account_id = source_account;
UPDATE accounts SET balance = balance + amount WHERE target_account = account_id;
END;
$$;
Скрытые проблемы
-
Отсутствие явной транзакции:
Запросы выполняются вне блокаBEGIN ... COMMIT/ROLLBACK
, поэтому при ошибке второй запрос может выполниться даже если первый завершился некорректно. -
Нет проверок на достаточность средств:
Никакой проверки на наличие достаточного баланса перед списанием средств не предусмотрено. -
Риск параллельных операций:
Если два перевода происходят одновременно, могут возникнуть гонки данных и нарушение целостности. -
Нет обработки ошибок:
При ошибках (например, неверный номер счёта) перевод частично выполняется, и деньги исчезают. -
Отсутствие изолированности:
Один из запросов может читать промежуточное состояние, когда деньги уже списаны, но ещё не зачислены.
Предложенные решения
1. Оборачивание перевода в транзакцию
CREATE OR REPLACE PROCEDURE transfer_funds(
source_account INT,
target_account INT,
amount NUMERIC
)
LANGUAGE plpgsql
AS $$
BEGIN
BEGIN
-- Проверка на существование счетов
IF NOT EXISTS (SELECT 1 FROM accounts WHERE account_id = source_account) THEN
RAISE EXCEPTION 'Исходный счёт не найден';
END IF;
IF NOT EXISTS (SELECT 1 FROM accounts WHERE account_id = target_account) THEN
RAISE EXCEPTION 'Целевой счёт не найден';
END IF;
-- Проверка баланса
IF (SELECT balance FROM accounts WHERE account_id = source_account) < amount THEN
RAISE EXCEPTION 'Недостаточно средств для перевода';
END IF;
-- Перевод средств
UPDATE accounts SET balance = balance - amount WHERE account_id = source_account;
UPDATE accounts SET balance = balance + amount WHERE account_id = target_account;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE NOTICE 'Произошла ошибка: %', SQLERRM;
END;
END;
$$ LANGUAGE plpgsql;
2. Уровень изоляции транзакций
Установите уровень изоляции, чтобы избежать чтения неподтверждённых изменений:
SET LOCAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
3. Добавление триггера логирования
Создайте таблицу и триггер для фиксации всех операций перевода:
CREATE TABLE transaction_log (
log_id SERIAL PRIMARY KEY,
source_account INT,
target_account INT,
amount NUMERIC,
status VARCHAR,
log_time TIMESTAMP DEFAULT NOW()
);
CREATE OR REPLACE FUNCTION log_transaction()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO transaction_log (source_account, target_account, amount, status)
VALUES (OLD.account_id, NEW.account_id, NEW.balance - OLD.balance, 'completed');
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Пример триггера (можно реализовать через AFTER UPDATE)
Обучающие моменты
- Важно использовать транзакции при критически важных операциях, таких как переводы.
- Уровень изоляции влияет на корректность работы с параллельными процессами.
- Необходима проверка входных данных и наличия ресурсов до выполнения операции.
- Обработка ошибок — обязательная часть любой финансовой системы.
- Логирование помогает отслеживать все изменения и восстанавливать данные при сбоях.
Ролевая игра №1: "SQL-расследование: Пропавшие миллионы"
Цель игры
Научить студентов применять продвинутые SQL-навыки для анализа данных, выявления аномалий, работы с большими объемами информации и построения сложных запросов. Также развить навыки командной работы, логического мышления и принятия решений в условиях ограниченного времени.
Формат
Командная ролевая игра (4–6 человек в команде), с элементами квеста и имитации реальной ситуации. Формат — 90 минут, включая брифинг, выполнение заданий и защиту результатов.
Сеттинг
Вы — группа специалистов по данным, приглашённых на срочное расследование в банк «Центральные Данные». За последние дни были замечены необъяснимые колебания остатков на клиентских счетах. Некоторые пользователи сообщили об исчезнувших миллионах, другие — о неожиданно начисленных средствах.
Ваша задача — разобраться, что происходит:
- Есть ли техническая ошибка?
- Возможно, это ошибка проектирования БД?
- Или кто-то намеренно манипулирует данными?
Роли в команде
-
Лидер / Тимлид
Отвечает за распределение задач, контроль времени и коммуникацию с преподавателем (в роли менеджера). -
Базоданный эксперт / DBA
Работает с таблицами, индексами, ограничениями и структурой БД. -
Аналитик данных / Data Detective
Выполняет анализ операций, пишет запросы на выборку, группировку, фильтрацию. -
Эксперт по безопасности / Аудитор
Проверяет логи, ищет следы подозрительной активности, проверяет целостность данных. -
Программист / SQL-разработчик
Пишет сложные SQL-запросы, работает с оконными функциями, CTE, материализованными представлениями. -
Тестировщик / QA-инженер
Проверяет корректность результатов, тестирует граничные случаи, предлагает дополнительные проверки.
(При необходимости роли могут объединяться.)
Этапы игры
Этап 1: Получение задания (10 мин)
Команда получает описание инцидента:
- Система перевода денег между клиентами показывает некорректные данные.
- Часть транзакций теряется или дублируется.
- Предоставляются фрагменты логов, примеры запросов и описание структуры БД.
Этап 2: Анализ базы данных (20 мин)
Команда изучает:
- Схему таблиц:
accounts
,transactions
,customers
,logs
. - Примеры SQL-запросов, которые использовались ранее.
- Логи системы и записи транзакций.
Этап 3: Поиск проблем (30 мин)
Команда должна:
- Обнаружить ошибки в реализации транзакций.
- Найти аномалии в данных.
- Выявить отсутствие проверок, блокировок, логирования.
- Восстановить потерянные суммы.
Этап 4: Защита решения и рекомендации (20 мин)
Команда представляет:
- Какие проблемы были найдены.
- Как они были исправлены.
- Какие улучшения предложены (индексы, триггеры, транзакции).
- Как можно предотвратить такие ситуации в будущем.
Обучающие эффекты
- Углубление знаний по транзакциям, уровню изоляции и ACID.
- Развитие навыков написания сложных SQL-запросов.
- Опыт работы с логами и восстановлением данных.
- Работа с реальными сценариями использования баз данных.
- Командная работа, управление временем, презентация решений.
Примеры скрытых проблем
-
Ошибка в хранимой процедуре перевода:
Процедура не использует транзакции — деньги списываются, но не доходят до адресата. -
Нет проверки на существование счёта:
Возможен перевод на несуществующий счёт без предупреждения. -
Отсутствует логирование:
Невозможно восстановить, какие операции были выполнены. -
Неправильный уровень изоляции:
Параллельные транзакции приводят к гонке данных. -
Нет индексов на поля
account_id
иtransaction_date
:
Запросы выполняются медленно, особенно при массовых проверках.
Ролевая игра №2: "Проектирование БД для платформы онлайн-образования"
Цель игры
Научить студентов проектировать эффективную и масштабируемую структуру базы данных с учётом бизнес-требований, нормализации, связей между таблицами и производительности. Развить навыки командной работы, анализа требований и принятия технических решений.
Формат
Командная ролевая игра (4–6 человек), с элементами дискуссии, проектирования и защиты решения. Длительность — 90 минут.
В игре участвуют несколько команд, каждая из которых представляет IT-подрядчика, претендующего на разработку системы.
Сеттинг
Вы — группа разработчиков в компании, которая участвует в тендере на создание базы данных для новой образовательной платформы EduPlatform , аналогичной Coursera или Stepik.
Платформа должна поддерживать:
- Курсы и уроки
- Пользователей (студентов и преподавателей)
- Прогресс обучения
- Тесты и задания
- Подписки и оплату
Ваша задача — предложить наиболее удачный вариант модели данных, обосновать его и защитить перед заказчиком (преподавателем).
Роли в команде
-
Архитектор БД / Главный проектировщик
Отвечает за построение логической и физической модели данных. -
SQL-разработчик / Базоданный инженер
Пишет примеры запросов, демонстрирует работу модели. -
Эксперт по производительности / Оптимизатор
Анализирует, как модель поведёт себя при больших объемах данных, какие индексы нужны. -
Тестировщик / QA-инженер
Проверяет модель на соответствие требованиям, выявляет потенциальные ошибки. -
Оратор / Коммуникатор
Готовит презентацию и защищает решение перед «заказчиком» (преподавателем).
(В случае малого количества участников роли могут объединяться.)
Этапы игры
Этап 1: Получение задания (10 мин)
Команды получают техническое задание:
Разработать модель данных для онлайн-платформы, где пользователи регистрируются, записываются на курсы, проходят уроки, выполняют задания и сдают тесты. Также необходимо отслеживать прогресс, систему оценок, подписки и взаимодействие с преподавателями.
Каждая команда получает:
- Описание предметной области.
- Перечень функциональных требований.
- Примеры типовых SQL-запросов, которые будут использоваться.
Этап 2: Проектирование модели БД (30 мин)
Команды:
- Создают ER-диаграммы или текстовое описание таблиц.
- Указывают поля, типы данных, связи, ограничения.
- Прописывают индексы и возможные представления.
Примеры таблиц:
users
courses
lessons
enrollments
progress
assignments
quizzes
payments
Этап 3: Написание SQL-запросов (20 мин)
Команды пишут:
- Запросы на выборку курсов пользователя.
- Расчёт среднего балла студента.
- Список курсов с наибольшим числом подписчиков.
- Пример создания триггеров или хранимых процедур.
Этап 4: Защита модели и дебаты (30 мин)
Команды поочерёдно:
- Представляют свою модель.
- Объясняют выбор архитектуры.
- Отвечают на вопросы заказчика и других команд.
- Предлагают меры по расширению и оптимизации.
Обучающие эффекты
- Практика проектирования реляционных баз данных.
- Навыки нормализации и денормализации.
- Понимание важности правильного выбора связей (один-ко-многим, многие-ко-многим).
- Работа с ограничениями, индексами и представлениями.
- Развитие soft skills: публичное выступление, критическое мышление, работа в команде.
Примеры проблем и вызовов
-
Нарушение нормализации:
Одна из команд создаёт таблицуuser_course_progress
, где данные о курсе повторяются для каждого пользователя. -
Отсутствие связи между таблицами:
Таблицы не связаны внешними ключами, что может привести к потере целостности. -
Избыточная денормализация:
Использование одной большой таблицы вместо нескольких связанных — сложно поддерживать и обновлять. -
Ошибка в проектировании отношений:
Многие-ко-многим реализовано без промежуточной таблицы. -
Неудобная структура для часто используемых запросов:
Например, нет отдельной таблицыcourse_ratings
, и оценки хранятся вusers
Ролевая игра №3: "SQL-аудит: Следствие по факту утечки данных"
Цель игры
Научить студентов анализировать логи, находить следы несанкционированного доступа и восстанавливать события с помощью SQL. Развить навыки работы с логами, безопасностью, аудитом и триггерами.
Формат
Командная ролевая игра (4–6 человек), в формате «расследования» с ограниченным временем. Участники выступают в роли специалистов по защите данных, которым нужно найти источник утечки. Длительность — 90 минут.
Сеттинг
Вы — группа экспертов по базам данных, приглашённых на срочное задание в крупную компанию DataCorp , которая столкнулась с подозрением на утечку конфиденциальной информации.
Пользователи сообщили, что их данные (почты, номера телефонов) оказались в руках сторонних лиц. Логи системы показывают подозрительную активность в БД. Ваша задача — провести внутреннее расследование, используя SQL-запросы, логи операций и информацию о пользователях.
Роли в команде
-
Главный следователь / Лидер
Организует работу, распределяет задачи, представляет выводы заказчику. -
Аналитик логов / Инженер данных
Изучает логи, находит подозрительные запросы и действия пользователей. -
Эксперт по безопасности / DBA
Анализирует привилегии, проверяет систему доступа, предлагает меры защиты. -
SQL-разработчик / Базоданный инженер
Пишет запросы для анализа активности, фильтрации и восстановления событий. -
Тестировщик / Аналитик событий
Проверяет гипотезы, отслеживает дубликаты, временные метки и аномалии.
(В случае малого количества участников роли могут объединяться.)
Этапы игры
Этап 1: Получение задания и брифинг (10 мин)
Команда получает:
- Краткое описание инцидента.
- Общий доступ к модели БД и таблицам логов.
- Перечень подозреваемых действий:
- Несанкционированный SELECT
- Массовое обновление или удаление
- Подозрительные входы и изменения прав
Этап 2: Изучение структуры БД и логов (15 мин)
Команда:
- Знакомится с таблицами:
users
,user_data
,logs
,access_logs
,roles
. - Изучает поля:
timestamp
,user_id
,action_type
,query
,ip_address
.
Этап 3: Поиск аномалий (40 мин)
Команда должна:
- Найти пользователей с подозрительно высоким числом запросов.
- Выявить SELECT'ы к чувствительным данным.
- Обнаружить попытки получения администраторских прав.
- Проверить, есть ли запросы без ограничений (например,
SELECT * FROM user_data
). - Найти подозрительные IP-адреса или время выполнения запросов.
Этап 4: Защита выводов и рекомендации (25 мин)
Команда:
- Представляет найденные нарушения.
- Объясняет, как был получен доступ к данным.
- Предлагает технические и организационные меры для предотвращения утечки.
- Отвечает на вопросы жюри и других команд.
Обучающие эффекты
- Применение SQL для анализа безопасности и аудита.
- Чтение и интерпретация логов базы данных.
- Использование подзапросов, оконных функций, фильтрации и группировки для детализации активности.
- Работа с реальными сценариями утечки данных.
- Развитие soft skills: защита своих решений, работа в команде, принятие решений в условиях ограниченной информации.
Примеры скрытых проблем
-
Нарушение контроля доступа:
Пользователь с ролью "читатель" имеет доступ к таблицеuser_sensitive_data
. -
Подозрительный запрос:
В логах находится строка:SELECT * FROM users WHERE role = 'admin';
-
Массовая выборка данных:
Было выполнено несколько запросовSELECT * FROM user_data
в течение одной минуты. -
Изменение прав через SQL:
В логах встречается запрос:UPDATE roles SET is_admin = TRUE WHERE user_id = 123;
-
Запрос из неизвестного IP:
Запись вaccess_logs
:user=admin ip=192.168.87.123 action=SELECT table=user_data
.
Ролевая игра №4: "SQL-оптимизация: Битва за производительность"
Цель игры
Научить студентов анализировать производительность SQL-запросов, находить узкие места и применять методы оптимизации. Развить навыки работы с планами выполнения, индексами, партиционированием и переформулировкой запросов.
Формат
Командная ролевая игра (3–5 человек), в формате «соревнования» между группами. Участники получают одинаковые медленные запросы и должны предложить максимально эффективное решение. Игра рассчитана на 90 минут и включает этап анализа, оптимизации и защиты решения.
Сеттинг
Вы — группа разработчиков в компании DataSpeed , которая занимается аналитикой больших объемов данных. Система начала работать медленно: пользователи жалуются на долгие отчёты, дашборды не обновляются вовремя, а некоторые запросы вообще падают по таймауту.
Вам поручено провести SQL-ревизию системы и ускорить ключевые запросы, чтобы вернуть стабильную работу платформы.
Вас оценивает технический комитет (преподаватель) по трём критериям:
- Скорость выполнения запроса
- Читаемость и поддерживаемость кода
- Эффективность предложенных решений
Роли в команде
-
Тимлид / Оптимизатор
Отвечает за распределение задач и выбор стратегии оптимизации. -
DBA / Эксперт по индексам
Анализирует структуру таблиц, создаёт и проверяет индексы. -
SQL-разработчик / Переписыватель запросов
Пишет оптимизированные версии медленных запросов. -
Аналитик / Тестировщик
Измеряет время выполнения, сравнивает до/после, составляет отчёт. -
Презентатор / Коммуникатор
Готовит выводы и представляет их комиссии.
(При необходимости роли могут объединяться.)
Этапы игры
Этап 1: Получение задания (10 мин)
Командам выдаются:
- Исходный SQL-запрос, который работает слишком долго.
- Описание предметной области (например, интернет-магазин, CRM или система логистики).
- Схема базы данных и примеры данных.
Этап 2: Анализ проблемы (20 мин)
Команды:
- Выполняют
EXPLAIN ANALYZE
и изучают план выполнения. - Определяют тип сканирования, количество строк, наличие соединений и фильтров.
- Выявляют отсутствие индексов, лишние JOIN'ы, частые full scan'ы.
Этап 3: Оптимизация (30 мин)
Команды:
- Добавляют индексы, где это необходимо.
- Переписывают запросы, заменяя подзапросы на CTE, JOIN’ы на EXISTS, пересматривают условия WHERE и GROUP BY.
- Предлагают денормализацию, партиционирование или создание материализованных представлений.
Этап 4: Защита решений (30 мин)
Каждая команда:
- Представляет исходный запрос и его слабые места.
- Показывает свой оптимизированный вариант.
- Объясняет, какие изменения были сделаны и почему они помогли.
- Отвечает на вопросы жюри и других участников.
Обучающие эффекты
- Понимание работы механизма выполнения SQL-запросов.
- Написание эффективных SQL-запросов.
- Применение индексов, оконных функций, CTE и материализованных представлений.
- Анализ планов выполнения (
EXPLAIN
,ANALYZE
). - Работа с большими объемами данных.
- Развитие soft skills: презентация, защита решений, работа в команде.
Интеллект-карта №1: "SQL — на профессиональном уровне"
Центральная тема:
Продвинутый SQL: от аналитики до оптимизации
Основные ветви:
1. Проектирование БД
- Нормализация: 1НФ–5НФ
- ER-диаграммы и UML
- Связи: один-ко-многим, многие-ко-многим
- Шаблоны проектирования: звезда, снежинка
2. Продвинутые запросы
- Подзапросы: скалярные, табличные, коррелированные
- CTE и рекурсивные CTE
- Оконные функции: RANK(), ROW_NUMBER(), LEAD(), LAG()
- GROUPING SETS, CUBE, ROLLUP
3. Производительность и оптимизация
- EXPLAIN / EXPLAIN ANALYZE
- Типы сканирования: index scan, seq scan
- Уровни изоляции и их влияние на параллелизм
- Индексы: B-Tree, BRIN, GIN, частичные, функциональные
4. Хранимые процедуры и триггеры
- Создание процедур и функций
- Обработка ошибок: TRY/CATCH
- Передача параметров
- Триггеры: BEFORE, AFTER, INSTEAD OF
5. Безопасность и контроль доступа
- Роли и пользователи
- GRANT / REVOKE привилегий
- Использование VIEW как механизма безопасности
- Защита от SQL-инъекций
6. Интеграция SQL с внешними системами
- Работа с JSON и XML
- ETL-процессы: Extract → Transform → Load
- ORM: SQLAlchemy, Django ORM
- Подключение к Python, Java, Node.js
7. Партиционирование и шардинг
- Виды партиционирования: по диапазону, списку, хэшу
- Partition pruning
- Шардинг и репликация
- Когда использовать: масштаб vs производительность
8. Миграция и управление версиями БД
- Понятие миграции
- Инструменты: Alembic, Flyway, Django Migrations
- Автоматизация изменений структуры
- Версионный контроль: Git + SQL-скрипты
Интеллект-карта №2: "Путь от новичка к SQL-профессионалу"
Центральная тема:
Как стать профессионалом в работе с SQL
Основные ветви:
1. От теории к практике
- Знание ACID и CAP-теоремы
- Разница между OLTP и OLAP
- Умение читать план выполнения запроса
- Понимание MVCC и WAL
2. Производительность и оптимизация
- Чтение EXPLAIN и анализ плана выполнения
- Настройка индексов под задачу
- Денормализация с умом
- Использование материализованных представлений
3. Аналитика и бизнес-логика
- Оконные функции: ранжирование, сравнение
- Работа с временными рядами
- PIVOT / UNPIVOT
- Сложная группировка: ROLLUP, CUBE
4. Безопасность и целостность
- Контроль доступа: роли, привилегии
- Логирование через триггеры
- Работа с транзакциями
- Предотвращение deadlock'ов
5. Работа с большими данными
- Партиционирование таблиц
- Использование BRIN и GIN
- Оптимизация через фильтрацию и ограничение выборки
- Работа с JSONB, массивами, полнотекстовым поиском
6. Архитектура и проектирование
- Выбор модели данных под задачу
- Управляемая денормализация
- Реализация ссылочной целостности
- Поддержка расширяемости и миграции
7. Интеграция и автоматизация
- SQL в связке с Python/Java
- Использование ORM
- ETL-процессы и пайплайны
- Автоматическое логирование и обновление
8. Профессиональный уровень: проектная работа
- Полноценное проектирование БД
- Оптимизация реального приложения
- Система контроля версий БД
- Отчеты и дашборды на основе SQL
Интеллект-карта №3: "SQL как карьера будущего"
Центральная тема:
SQL в современной IT-индустрии: где применяется, куда ведёт
Основные ветви:
1. SQL в мире IT
- Одна из самых востребованных технологий
- Язык запросов к данным в любой сфере
- Не требует замены при переходе на другую специализацию
2. Где используется SQL
- Data Analyst: выгрузка, фильтрация, агрегация
- Backend Developer: работа с ORM, запросы к БД
- BI-инженер: построение отчетов и дашбордов
- DBA: администрирование, мониторинг, бэкапы
- ML-инженер: подготовка данных для моделей
3. Профессии, связанные с SQL
- Разработчик БД
- Аналитик данных
- Инженер данных
- QA-инженер (проверка данных)
- DevOps с SQL-компонентами
4. Карьерный рост
- Junior SQL Developer
- Middle SQL Developer
- Senior SQL / Data Engineer
- Архитектор БД
- Эксперт по Big Data
5. Инструменты и технологии
- PostgreSQL, MySQL, Oracle, SQL Server
- DBeaver, pgAdmin, DDL/DML
- SQLAlchemy, Django ORM
1. "SQL: Продвинутый уровень" — Джо Селко
- Уровень : профессиональный
- Описание : Книга охватывает сложные аспекты SQL, включая оконные функции, рекурсивные запросы, оптимизацию и проектирование БД. Подробно рассмотрены темы нормализации, работы с временными данными и OLAP-функциями.
- Почему стоит использовать : отличное руководство по продвинутому SQL, написано доступным языком с примерами из реальной практики.
2. "SQL и анализ данных" — Алан Р. Бейли
- Уровень : средний – профессиональный
- Описание : Учебник ориентирован на работу с аналитическими запросами. Темы: агрегация, оконные функции, работа с временными рядами, интеграция с BI-системами.
- Почему стоит использовать : подходит как для обучения, так и для практического применения в аналитике и отчетности.
3. "PostgreSQL: Основы разработки" — Иван Панченко
- Уровень : профессиональный
- Описание : Полное руководство по работе с PostgreSQL. Темы: транзакции, триггеры, хранимые процедуры, оптимизация, использование JSONB, управление параллелизмом (MVCC), работа с большими объемами данных.
- Почему стоит использовать : актуально для тех, кто хочет работать с одной из самых мощных open-source СУБД.
4. Методическое пособие: "SQL-оптимизация и проектирование БД" — Т.А. Григорьева
- Уровень : профессиональный
- Описание : Методичное руководство для преподавателей и студентов. Содержит лабораторные работы, кейсы, задания по оптимизации запросов и проектированию структур.
- Почему стоит использовать : удобен для организации занятий и контроля знаний, содержит готовые упражнения и решения.
5. Задачник: "SQL. Профессиональная практика" — Валерий Чистяков
- Уровень : профессиональный
- Описание : Сборник сложных задач по SQL с решениями. Темы: CTE, оконные функции, оптимизация, материализованные представления, партиционирование, триггеры, транзакции.
- Почему стоит использовать : идеальный инструмент для закрепления навыков через решение реальных задач, близких к промышленному уровню.
- SQL: профессия разработчика баз данных
Курс ориентирован на углубленное изучение SQL как инструмента для создания, управления и оптимизации реляционных баз данных. Подходит для тех, кто планирует работать с данными на уровне профессионала.
- Продвинутый SQL: практика разработчика БД
Научитесь писать сложные запросы, работать с транзакциями, триггерами и хранимыми процедурами. Курс включает практические задачи, работу с большими объемами данных и проект по оптимизации.
- SQL для профессионалов: от теории к практике
Курс предназначен для специалистов, уже знакомых с основами SQL. Вы научитесь проектировать эффективные структуры, оптимизировать производительность и использовать продвинутые функции языка.
- Оптимизация SQL-запросов и баз данных
Изучите методы ускорения работы с данными, анализа плана выполнения, использования индексов и денормализации. Курс включает реальные примеры и кейсы из промышленной эксплуатации.
- Проектирование баз данных: от идеи до реализации
Курс охватывает этапы проектирования БД, нормализацию, моделирование данных, создание ER-диаграмм и выбор архитектурных решений под конкретные задачи.
- Транзакции, параллелизм и целостность данных
Погрузитесь в работу с транзакциями, уровни изоляции, механизмы блокировок и контроль целостности. Научитесь обеспечивать надежность при работе с критическими системами.
- Хранимые процедуры и функции в SQL
Освойте написание и использование процедур и функций, передачу параметров, обработку ошибок и управление бизнес-логикой внутри СУБД.
- Оконные функции и аналитические возможности SQL
Курс посвящен оконным функциям, их применению в анализе данных и построении сложных отчетов. Подходит для Data Analysts и BI-разработчиков.
- SQL и большие данные: работа с высоконагруженными системами
Изучите особенности работы SQL с большими объемами данных. Темы: партиционирование, индексы, шардинг, материализованные представления, EXPLAIN.
- Работа с JSON и NoSQL возможностями в SQL
Научитесь работать с неструктурированными данными в рамках реляционных СУБД. Рассмотрены возможности PostgreSQL, MySQL и других современных систем.
- Создание и оптимизация ETL-процессов
Курс поможет освоить Extract, Transform, Load — этапы подготовки данных для аналитики и хранилищ. Практическое применение SQL в цепочках обработки информации.
- Миграции и управление версиями схемы БД
Освойте принципы изменения структур баз данных без потери данных. Изучите инструменты миграций: Alembic, Django Migrations, Flyway и Liquibase.
- Работа с CTE, рекурсивными запросами и подзапросами
Подробное рассмотрение одного из самых мощных механизмов SQL — Common Table Expressions. Включает рекурсивные запросы, CASE, UNION ALL и другие конструкции.
- Индексы, планы выполнения и оптимизация запросов
Курс посвящен пониманию и улучшению производительности SQL-запросов. Вы научитесь читать EXPLAIN, выбирать типы индексов и находить узкие места.
- Триггеры, события и автоматизация в SQL
Изучите способы автоматизации операций в базе данных через триггеры, события и хранимые процедуры. Примеры применения в системах учета и логирования.
- SQL и безопасность: защита данных и контроль доступа
Курс обучает организации безопасности в SQL: роли, привилегии, VIEW как механизм ограничения доступа, защита от SQL-инъекций.
- Работа с транзакциями в распределённых системах
Изучение ACID-транзакций, двухфазного коммита, уровней изоляции и особенностей работы в условиях параллелизма и отказоустойчивости.
- SQL в связке с Python / Java / Node.js
Курс научит вас использовать SQL в составе полноценных приложений. Темы: ORM, работа с драйверами, вызов хранимых процедур, обработка результатов.
- Аналитический SQL: от данных к выводам
Курс для тех, кто хочет строить отчеты, анализировать данные и работать с метриками. Основные темы: GROUPING SETS, ROLLUP, PIVOT, OLAP-функции.
- Материализованные представления и кэширование результатов
Обучение использованию материализованных представлений, их обновлению, хранению и применению для повышения скорости аналитических запросов.
- Работа с данными в реальном времени
Курс посвящен особенностям работы с актуальными и быстро меняющимися данными. Темы: частые обновления, логирование изменений, мониторинг активности.
- Профессиональная работа с PostgreSQL
Курс посвящен углубленному изучению одной из самых популярных open-source СУБД. Темы: JSONB, GIN/GiST-индексы, пользовательские функции, триггеры.
- SQL-оптимизация: от медленных запросов к высокой производительности
Курс помогает научиться находить и исправлять проблемные участки в SQL-запросах. Использование EXPLAIN, переформулировка, индексы и денормализация.
- Создание и поддержка хранилищ данных с помощью SQL
Курс научит использовать SQL для построения DWH, работы с фактами и измерениями, создания звездных и снежинковых схем.
- SQL как карьера: от пользователя к архитектору БД
Курс объединяет теорию и практику, чтобы показать путь развития от разработчика SQL-запросов к архитектору баз данных. Темы: проектирование, масштабируемость, безопасность, миграции.
Нет элементов для просмотра