我们可以优化这个SQL查询吗?

时间:2017-08-04 04:47:36

标签: sql oracle11g query-optimization common-table-expression

这是架构:

  Product(maker, model, type)
  PC(code, model, speed, ram, hd, cd, price)

产品表包含有关制造商,型号和产品类型的数据(' PC','笔记本电脑'打印机')。假设Product表中的型号对于所有制造商和产品类型都是唯一的。 PC表中的每台个人计算机都由唯一代码明确标识,并且其特征还在于其型号(外键指产品表),处理器速度(以MHz为单位) - 速度字段,RAM容量(以Mb为单位) - ram ,硬盘驱动器容量(以Gb为单位) - 高清,CD-ROM速度(例如,' 4x') - cd及其价格。

现在,要求发现打印机制造商还生产具有最低RAM容量和最高RAM容量的所有PC的最高处理器速度的PC。

我写了这个查询:

WITH outp AS
(
     SELECT 
         P.Maker, MAX(PC.Speed) AS Speed
     FROM 
         PC
     JOIN 
         Product P ON P.model = PC.Model
     WHERE
         P.maker IN (SELECT maker FROM Product WHERE type = 'Printer')
         AND PC.Ram = (SELECT MIN(ram) FROM PC)
     GROUP BY 
         Maker
)
SELECT maker 
FROM outp
WHERE speed = (SELECT MAX(speed) FROM outp) 

这是有效的,但我想优化这个查询或找到另一个比这个更小的查询。有什么帮助吗?

谢谢你们......

1 个答案:

答案 0 :(得分:0)

使用分析可能会更快:

SELECT * FROM 
(
  SELECT 
    P.Maker, 
    pc.speed, 
    MAX(PC.Speed) over() AS maxSpeed
  FROM 
    (SELECT pc.speed, pc.ram, p.maker, min(pc.ram) over() as minram FROM pc INNER JOIN Product P ON P.model = PC.Model) pc 
    INNER JOIN
    Product pr 
    ON 
      pc .maker = pr.maker AND
      pr.type = 'printer' 
  WHERE
    pc.Ram = pc.minram
  ) a
WHERE 
  a.speed = a.maxspeed

我相信你首先要过滤到只有制造打印机的个人电脑制造商,这些个人电脑中所有个人电脑都是最少的

然后从该子集中找到最快的pc

但是如果你想找到那些ram最小并且速度最高的PC(不仅仅是低ram规格中最快的那款),那么你可以将最大速度超过min ... ram子句,抛弃最外层的查询并将maxspeed条件放在与min ram条件相同的位置