基于交叉生产的SQL查询优化?

基于交叉生产的SQL查询优化?,sql,db2,Sql,Db2,我有以下模式 客户(CID整数不为空,名称为VARCHAR(30),地址为VARCHAR(50)) 产品(PID整数不为空,名称为VARCHAR(50),价格小数(10,2)) 销售(SID BIGINT不为空,状态VARCHAR(10),CID整数,总价十进制(30,2)) PRODUCTSALE(SID BIGINT不为空,PID整数不为空,单位整数,小计小数(30,2)) 我现在有这样一个声明: SELECT P.NAME, COUNT(DISTINCT C.CID) AS

我有以下模式

  • 客户(CID整数不为空,名称为VARCHAR(30),地址为VARCHAR(50))

  • 产品(PID整数不为空,名称为VARCHAR(50),价格小数(10,2))

  • 销售(SID BIGINT不为空,状态VARCHAR(10),CID整数,总价十进制(30,2))

  • PRODUCTSALE(SID BIGINT不为空,PID整数不为空,单位整数,小计小数(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)的交叉积?我可以在其中四个上使用nature join来优化它吗?优化此语句的其他方法是什么?

从最大的表开始并向下筛选

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

-在ANSI-92 SQL标准(超过25年前)中,旧样式的逗号分隔表列表样式被正确的ANSI
JOIN
语法所取代,它的使用是不鼓励的。主键和外键不会有任何影响。您使用的是什么版本和平台的Db2?另外,您真的希望允许例如PRODUCT.NAME、,状态,CUSTOMER.NAME。最好使列不为NULL,除非您真的想让小数中的NULL相当大。您真的需要28位十进制有效数字(30,2)。。像十进制(17,2)这样的东西可能比sufficient@PaulVernon我认为内部联接比交叉积性能更好?我是新来的,这就是我想在这里向专家验证的。在本例中,Db2将把查询重新写入相同的内部表单。另外,原来的帖子并不是一个真正的交叉产品,只是连接在哪里是好的,只是旧的风格SQL@PaulVernon根据w3resource.com/sql/joins/cross-join.php,从foods,company中选择foods.item_name,foods.item_unit,company.company_name,company.company_city;结果为笛卡尔积。我认为我的问题是一样的?你问题中的C.CID=S.CID和S.SID=PS.SID和PS.PID=P.PID阻止了它成为所有意图和目的的交叉产物