【问题标题】:Can we Optimise this sql query?我们可以优化这个 sql 查询吗?
【发布时间】:2018-01-11 21:33:57
【问题描述】:

这是架构:

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

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

现在,要求是找到同时生产具有最低 RAM 容量和最高处理器速度的 PC 的打印机制造商,这些 PC 具有最低 RAM 容量。

我写了这个查询:

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) 

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

谢谢大家...

【问题讨论】:

  • 请运行EXPLAIN PLAN FOR your_query,然后运行SELECT * FROM table( DBMS_XPLAN.Display ),然后将最后一个查询的结果复制为文本(不是位图),并将其附加到您的问题中(使用编辑选项)。

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


【解决方案1】:

使用分析可能会更快:

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 规格中最快的),那么您可以将 max speed over... 子句移到 min 旁边ram 子句,放弃最外层的查询,并将 maxspeed 条件与 min ram 条件放在相同的位置

【讨论】:

    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2022-10-30
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多