Оптимизация SQL-запросов при перекрестном производстве? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть следующая схема

  • ЗАКАЗЧИК (CID INTEGER NOT NULL, ИМЯ VARCHAR (30), АДРЕС VARCHAR (50))

  • PRODUCT (PID INTEGER NOT NULL, ИМЯ VARCHAR (50), ЦЕНА (10,2))

  • ПРОДАЖА (SID BIGINT NOT NULL, СТАТУС VARCHAR (10), CID INTEGER, ПОЛНАЯ ЦЕНА (30,2))

  • ПРОДАЖА ПРОДУКТА (SID BIGINT NOT NULL, PID INTEGER NOT NULL, ЕДИНИЦЫ INTEGER, ПОСЛЕДУЮЩАЯ ДЕСЯТИЧНАЯ (30,2))

У меня сейчас есть такое утверждение:

SELECT 
    P.NAME, COUNT(DISTINCT C.CID) AS NUM_CUSTOMERS 
FROM 
    CUSTOMER AS C, PRODUCT AS P, PRODUCTSALE AS PS, SALE AS S 
WHERE 
    C.CID = S.CID
    AND S.SID = PS.SID 
    AND PS.PID = P.PID 
GROUP BY 
    P.NAME 
ORDER BY
    NUM_CUSTOMERS  DESC

Я думаю, что это создает кросс-произведение из четырех таблиц (P, S, PS, C)? Могу ли я оптимизировать это с помощью природы join на четырех из них? Как еще можно оптимизировать это утверждение?

1 Ответ

0 голосов
/ 28 марта 2019

Начните с самой большой таблицы и отфильтруйте.

SELECT p.NAME, COUNT(DISTINCT c.CID) AS NUM_CUSTOMERS
FROM ProductSale ps
INNER JOIN Product p ON ps.PID=p.PID
INNER JOIN Sale s ON ps.SID=s.SID
INNER JOIN Customer c ON s.CID=c.CID
GROUP BY p.Name
ORDER BY NUM_CUSTOMERS DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...