Расчет сложности оптимизированного запроса приведен ниже.
, (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











