Рассматривается ядро транзакционной банковской системы (OLTP), состоящее из двух ключевых сущностей:
Задание 1.1: Напишите SQL-скрипт объявления внешнего ключа между таблицами и команду индексации внешнего ключа. Объясните, почему индексация FK id_счета критически необходима для устранения каскадных блокировок и ускорения JOIN.
Самый частотный запрос мобильного приложения банка — получение истории операций клиента за указанный период времени с хронологической сортировкой:
SELECT * FROM Transactions
WHERE id_счета = ? AND дата_транзакции BETWEEN ? AND ?
ORDER BY дата_транзакции DESC;
Задание 1.2: Спроектируйте оптимальный составной B-Tree индекс. Обоснуйте порядок колонок с точки зрения правила левого префикса (Left-Prefix Rule), селективности предикатов (равенство vs диапазон) и устранения фазы сортировки в оперативной памяти.
В таблице транзакций накоплено 10 000 000 строк. Средний клиент совершает 40 операций в месяц.
Задание 1.3:
Seq Scan и Index Scan: сколько страниц считывается в каждом случае и как меняется метрика cost?WHERE дата_транзакции BETWEEN ..., будет ли использоваться составной индекс (id_счета, дата_транзакции)? Обоснуйте ответ.Задание 2.1: Напишите DDL-команды создания связей и индексов для таблицы звонков (включая индекс внешнего ключа тарифа и поиск абонента по номеру телефона). Объясните, чем чревато отсутствие индекса на FK при удалении тарифа.
В таблице Calls хранится 100 000 000 архивных вызовов. В любой момент времени статус 'ACTIVE' имеют не более 50 000 звонков (0.05% строк). Биллинговому сервису необходимо ежесекундно проверять активные звонки абонента для тарификации:
SELECT * FROM Calls WHERE статус = 'ACTIVE' AND номер_телефона = ?;
Задание 2.2: Спроектируйте частичный индекс (Partial Index). Обоснуйте колоссальную экономию оперативной памяти (RAM) и кэша Buffer Pool по сравнению со стандартным B-Tree индексом на 100 млн записей.
Задание 2.3:
'COMPLETED'?Задание 3.1: Напишите DDL-скрипт создания связей по внешним ключам и их обязательной физической индексации. Обоснуйте необходимость индексов на FK при генерации отчетов по агентствам недвижимости.
Пользователи каталога непрерывно ищут квартиры по сложному фильтру с диапазоном цен:
SELECT * FROM Properties
WHERE город_id = 42 AND комнат = 2 AND цена BETWEEN 5000000 AND 9000000;
Задание 3.2: Спроектируйте оптимальный составной B-Tree индекс (город_id, комнат, цена). Обоснуйте, почему диапазонное поле цены обязано стоять строго последним. Что произойдет, если создать индекс как (цена, город_id, комнат)?
Задание 3.3:
(город_id, комнат, цена) и ошибочным (цена, город_id, комнат).(город_id, комнат, цена) для запроса WHERE комнат = 2 AND цена < 6000000 без указания город_id? Обоснуйте ответ правилом левого префикса.Задание 4.1: Напишите DDL-команды создания уникального индекса на трек_номер и индексов на внешние ключи. Объясните двойную роль уникального индекса (бизнес-ограничение целостности + быстрый поиск).
Каждое утро диспетчер логистического центра формирует путевой лист для сотен курьеров:
SELECT * FROM Shipments
WHERE id_курьера = ? AND дата_доставки = CURRENT_DATE
ORDER BY id_заказа;
Задание 4.2: Спроектируйте составной индекс для ускорения ежедневных отчетов диспетчера. Обоснуйте порядок колонок и влияние индекса на устранение операций Seq Scan.
Задание 4.3: