2017-08-04 118 views
0

這是架構:我們可以優化這個sql查詢嗎?

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

產品表包含製造商的數據,型號,產品類型(「PC」,「筆記本電腦」或「打印機」)。假定產品表中的型號對於所有制造商和產品類型都是唯一的。在PC表中的每一個人計算機明確地由一個唯一的編碼標識,並通過它的模型(外鍵指的是產品表),處理器速度(單位爲MHz)的另外特徵在於 - 速度場,RAM容量(MB) - 夯,硬盤驅動器容量(Gb) - 高清,CD-ROM速度(例如'4x') - cd及其價格。現在

的要求是,以找到打印機廠商也生產具有最低的RAM容量,並具有最低的RAM容量所有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) 

這是工作,但我想優化這個查詢或另謀查詢比這更笨重。任何幫助?

感謝球員...

+0

請運行'解釋計劃your_query'然後運行'SELECT * FROM表(DBMS_XPLAN.DISPLAY)',然後最後一個查詢的結果複製爲文本(而不是位圖),並將它添加到你的問題(使用編輯選項)。 – krokodilko

回答

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廠商,使打印機,其中那些個有最低的所有電腦公羊

,然後從該子集,找到最快的PC

但是,如果你想找到它的RAM是最低的PC,其速度(不僅僅是最低的ram規格的最快速度),那麼你可以移動最大速度over ...子句以及最小ram子句,排除最外面的查詢並將最大速度條件放在與min RAM條件