Расчет сложности оптимизированного запроса приведен ниже.
, (2.14)
где - операция селекции с логической формулой .
Формула имеет вид:
, (2.15)
,
,
, (2.16)
.
Так как операция селекции не изменяет структуру таблицы, то
,
.
, (2.17)
где - результат естественного соединения таблиц;
- таблицы, участвующие в соединении;
- псевдонимы, используемые вместо имен таблиц для сокращения записи;
- операция естественного соединения.
, (2.18)
(2.19)
,
,
,
.
, (2.20)
, (2.21)
где - число блоков, записанных в таблице ;
- длина одной записи таблицы в блоках;
- длина одной записи таблицы в байтах;
- размер одного блока.
Очевидно, что
, (2.22)
где - объем в байтах поля ;
- объем в байтах поля ;
,
,
.
.
.
.
, (2.23)
,
,
,
,
, (2.24)
.
Очевидно, что
, (2.25)
,
,
,
.
.
.
Так как операция проекции располагается последней, то ее не учитывают при расчете сложности запроса.
Окончательно имеем:
, (2.26)
Запрос на деление
Словесная формулировка запроса
Выбрать всех клиентов, которые приобрели все без исключения препараты, перечисленные в отдельном списке – отдельной таблице.
Текст запроса на языке SQL
Текст запроса представлен на рисунке 2.23
SELECT COUNT(*); FROM product INTO ARRAY Ar SELECT clients.clientid, clients.name; FROM ((clients JOIN orders ON orders.clientid = clients.clientid) JOIN Ar ON orders.productid = Ar.productid); GROUP BY clients.clientid, clients.name; HAVING COUNT(*)=Ar; |
Рисунок 2.23
Исходное дерево запроса
Дерево запроса представлено на рисунке 2.24.
q2
q1
product clients
clients orders
Рисунок 2.4