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; |
q1
product clients
clients orders
Расчет сложности исходного запроса приведен ниже.
, (2.27)где
- результат естественного соединения таблиц; - таблицы, участвующие в соединении; - псевдонимы, используемые вместо имен таблиц для сокращения записи; - операция естественного соединения. , (2.28) (2.29)где
- число записей в таблице ; - число записей в таблице С; - число записей в таблице O; - число различных значений в столбце clientid таблицы Clients; - число различных значений в столбце clientid таблицы Orders. , , , . , (2.30) , (2.31)где
- число блоков, записанных в таблице ; - длина одной записи таблицы в блоках; - длина одной записи таблицы в байтах; - размер одного блока.Очевидно, что
, (2.32)где
- объем в байтах поля ; - объем в байтах поля ; , , . . . . , (2.33) , , , , . (2.34) .Очевидно, что
, (2.35) , , , . . . (2.36)где
- операция проекции из таблицы атрибутов . . . , , .Так как операция группировки является последней, то для нее не производится расчет сложности.
Окончательно имеем:
, (2.37)Оптимизированное дерево запроса представлено на рисунке 2.25.
|