2012-10-26 75 views
0

我HAVA窩查詢性能:,以提高查詢

SELECT PIXEL_X as 'X_Coord', PIXEL_Y as 'Y_Coord', 
CONVERTWATTS2DBM_udf(SUM(L2_VALUE)/SUM(L3_VALUE)) as 'Pixel_Value' 
    FROM table 
    WHERE 
     ('GSM 850/900' like CONCAT('%',FILTER2,'/%') OR 
     'GSM 850/900' like CONCAT('%/',FILTER2,'%')) 
GROUP BY X_Coord, Y_Coord; 

而且需要很長的時間,你可以幫助我提高自己的表現?

感謝

+0

使用%..%過濾查詢關係數據庫效率低下 - 它幾乎總是需要表掃描。你使用什麼類型的引擎:MyISAM或InnoDB?你有沒有試過運行這個查詢沒有分組來檢查過濾需要多長時間?最後,FILTER2有哪些可能的值以及'GSM 850/900'列中的值是什麼? – lowleveldesign

回答

0

一個直接的方法來優化將是這樣:

  • 創建過濾器變量自己,在任何一種語言,你用它來訪問數據庫。
  • 設置一個查詢每個選項的 「GMS 850/900」,就加入他們一起使用UNION,就像這樣:

    SELECT PIXEL_X as 'X_Coord', PIXEL_Y as 'Y_Coord', 
    CONVERTWATTS2DBM_udf(SUM(L2_VALUE)/SUM(L3_VALUE)) as 'Pixel_Value' 
    FROM table WHERE 
    'GSM 850/900' like '%YOURVALUE1%' 
    UNION 
    SELECT PIXEL_X as 'X_Coord', PIXEL_Y as 'Y_Coord', 
    CONVERTWATTS2DBM_udf(SUM(L2_VALUE)/SUM(L3_VALUE)) as 'Pixel_Value' 
    FROM table WHERE 
    'GSM 850/900' like '%YOURVALUE2%' 
    

這應該加快查詢。

此外,如果您事先生成了您在飛行中生成的值,它將加快查詢速度。您可以創建一個列並在ON WRITE觸發器中生成CONVERTWATTS2DBM_udf。這將消除不僅在每行上運行此函數的必要性,而且還會在查詢本身的每次運行中都運行該函數。

最後,通過Pixel_X,Pixel_Y和新創建列的複合索引可以進一步加快查詢速度。

+0

感謝您的答案,但沒有改善,表是暫時的,是否有可能在臨時表中創建索引? – Jjreina

+0

當然。對於所有帳戶和目的而言,臨時表等於普通表。只有範圍是不同的。臨時表的範圍可以是連接,也就是說,連接的關閉將臨時表的範圍限定在它的範圍內。 – 0xCAFEBABE