ТОРА (9) - Семинар №8 - Пример решения ДЗ на оптимизацию запроса
Содержание
Пример решения ДЗ №3
Это не само решение, а только разбор похожей задачи. И тот не до конца.
Предметная область
$S$ - таблица "Поставщик", описывающая поставщиков деталей. Имеет следующие поля:
- номер поставщика - идентификационный номер поставщика (ключевое поле);
- имя - фамилия, имя и отчество поставщика;
- состояние - состояние поставщика (состояние счета);
- город - город, в котором проживает поставщик и в котором находится его центральный офис.
$P$ - таблица "Деталь". Описывает поставляемые детали и включает следующие поля:
- номер детали - идентификационный номер детали (ключевое поле);
- название - название детали;
- цвет - цвет детали;
- вес - все детали в фунтах;
- город - город, в котором изготавливается деталь.
$J$ - таблица "Изделие". Описывает изготавливаемые изделия и включает следующие поля
- номер изделия - идентификационный номер изделия (ключевое поле);
- название - название изделия;
- город - город, где изготавливается изделие.
$SPJ$ - таблица "Сборка". Имеет следующие поля:
- номер поставщика — идентификационный номер поставщика, поставляющего деталь (ключевое поле);
- номер детали - идентификационный номер детали, поставляемой поставщиком (ключевое поле);
- номер изделия - идентификационный номер изделия, в которое входит деталь, поставляемая поставщиком (ключевое поле);
- количество - количество деталей, поставляемых поставщиком для данного изделия (количество деталей в поставке).
Диаграмма сущность-связь:
Запрос
Поступает запрос: "Найти название изделий, изготавливаемых в Париже и содержащих детали с названием "винт"". В запросе участвуют таблицы Деталь, Изделие и Сборка.
SELECT J.название FROM P, J, SPJ WHERE J.город = 'Париж' AND P.название = 'винт' AND J.ном_изд = SPJ.ном_изд AND P.ном_дет = SPJ.ном_дет;
Преобразовать этот запрос в форму реляционной алгебры:
$\Pi_{назв\_ изд}(\sigma_{J.город = Париж\wedge P.название = винт\wedge J.ном\_ изд = SPJ.ном\_ изд\wedge P.ном\_ дет = SPJ.ном\_ дет}(P\times J\times SPJ)) =$
применяем закон каскада селекций:
$= \Pi_{назв\ _изд}(\sigma_{J.ном\_ изд = SPJ.ном_изд\wedge P.ном\_ дет = SPJ.ном\_ дет}(\sigma_{J.город = Париж\wedge P.название = винт}(P\times J\times SPJ))) =$
применяем закон селекции декартова произведения:
$= \Pi_{назв\_ изд}(\sigma_{J.ном\_ изд = SPJ.ном\_ изд\wedge P.ном\_ дет = SPJ.ном_дет}(\sigma_{J.город = Париж}(J)\times\sigma_{P.название = винт}(P)\times SPJ)) =$
применяем закон перестановки проекции и селекции:
$= \Pi_{назв\_ изд}(\sigma_{J.ном\_ изд = SPJ.ном\_ изд\wedge P.ном\_ дет = SPJ.ном\_ дет}(\Pi_{J.название, J.ном\_ изд, SPJ.ном\_ изд, P.ном\_ дет, SPJ.ном\_ дет,J.город = Париж}(J)\times$
- $\times\sigma_{P.название = винт}(P)\times SPJ)) =$
применяем закон перестановки проекции и декартова произведения:
$= \Pi_{назв\_ изд}(\sigma_{J.ном\_ изд = SPJ.ном\_ изд\wedge P.ном\_ дет = SPJ.ном\_ дет}($
- $\Pi_{J.название, J.ном\_ изд}(\sigma_{J.город = Париж})$$\times$
- $\times$$\Pi_{P.ном\_ дет}(\sigma_{P.название = винт})$$\times$
- $\times$$\Pi_{SPJ.ном\_ изд, SPJ.ном\_ дет}(SPJ)$$))$
Каждая из проекций - подзапрос.
Логический план
Генерация физического плана
- Необходимо определить, как реализуются подзапросы $Q_1$, $Q_2$ и $Q_3$. Возможно два варианта:
- полное сканирование таблицы;
- использование индекса;
- Определить порядок соединения таблиц. Реализуется тремя вложенными циклами;
- Определить метод соединения.
В результате получится структура $str[7]$, в которой будет описано, как лучше соединять.