Данная работа представляет собой резервное дистанционное практическое задание по дисциплине «ОП.08 Основы проектирования баз данных» (СИЭУиП). Все поля сохраняются локально в вашем браузере. После заполнения экспортируйте результат в PDF или передайте преподавателю.
Вам поручена разработка и оптимизация модуля формирования аналитических выписок в информационной системе корпоративного лизинга транспортных средств «ТрансЛизинг-Корп».
База данных содержит основную учетную таблицу договоров лизинга LeaseContracts со следующей структурой:
contract_id (BIGINT, PRIMARY KEY) — уникальный идентификатор договора;client_id (BIGINT, NOT NULL) — идентификатор клиента-лизингополучателя;region_code (VARCHAR(10), NOT NULL) — код субъекта РФ (например, 'RU-MOW', 'RU-SPE', 'RU-KHM');vehicle_category (VARCHAR(30), NOT NULL) — категория транспорта ('TRUCK', 'CAR', 'BUS', 'SPECIAL');contract_status (VARCHAR(20), NOT NULL) — статус ('ACTIVE', 'CLOSED', 'DEFAULT', 'PENDING');contract_sum (NUMERIC(15,2), NOT NULL) — общая сумма финансирования в рублях;monthly_payment (NUMERIC(15,2), NOT NULL) — ежемесячный лизинговый платеж;signing_date (DATE, NOT NULL) — дата подписания договора;credit_rating (NUMERIC(3,1), NULL) — скоринговый балл риска клиента (от 1.0 до 10.0; может быть NULL, если оценка не проводилась).Сформируйте SQL-запрос для аналитического отчета службы безопасности и финансового мониторинга со следующими строгими требованиями:
contract_status = 'ACTIVE');'TRUCK' или 'SPECIAL');region_code) по возрастанию с явным указанием локали COLLATE "C";credit_rating) по убыванию (DESC), при этом договоры с нерассчитанным рейтингом (NULL) должны обязательно выводиться в самом конце списка (NULLS LAST);contract_sum) по убыванию;contract_id) по возрастанию.Ответьте на аналитические вопросы по поведению сформированного запроса:
NULLS LAST в PostgreSQL при сортировке ORDER BY credit_rating DESC? Опишите конкретный бизнес-риск для отчета финансового мониторинга.region_code допустимо использование COLLATE "C", тогда как для поля с кириллическим наименованием клиента (ФИО) использование COLLATE "C" привело бы к грубой ошибке алфавитной сортировки?В таблице LeaseContracts содержится 12 000 000 строк. При выполнении запроса из Задания 1 планировщик EXPLAIN ANALYZE показывает:
-> Seq Scan on leasecontracts (cost=0.00..385412.00 rows=142000 width=128)
Filter: ((contract_status = 'ACTIVE') AND ...)
Rows Removed by Filter: 11858000
-> Sort (cost=412050..412405 rows=142000)
Sort Key: region_code, credit_rating DESC NULLS LAST, contract_sum DESC, contract_id
Sort Method: external merge Disk: 32400kB
Требуется:
CREATE INDEX составного B-Tree индекса, который устранит операцию external merge Disk и позволит выполнить запрос через чистый Index Scan без отдельного узла сортировки в памяти (правило ESR: Equality → Sort → Range).region_code = 'RU-MOW', credit_rating = 8.5, contract_sum = 12500000.00, contract_id = 948120.