2010-12-09 28 views
0
SELECT 
    AI_636.PARENT_ID AS PART, 
    MAX(b.AP_1036) AS ESTEND, 
    MAX(a.AP_3222) AS ACTEND 
FROM 
    AI_636 
    LEFT OUTER JOIN AI_665 a 
    ON 
    (
     a.AP_1033 = AI_636.PARENT_ID 
     AND SUBSTR(a.AP_1028, 1, 4) >= '2000' 
     AND a.AP_1030 NOT IN ('994') 
     AND 
     (
     a.AP_1033 NOT IN 
     (
      SELECT AI_665.AP_1033 FROM AI_665 WHERE AI_665.AP_3222 IS NULL 
     ) 
    ) 
    ) 
    JOIN AI_665 b 
    ON 
    (
     b.AP_1033 = AI_636.PARENT_ID 
     AND SUBSTR(b.AP_1028, 1, 4) >= '2000' 
    ) 
    GROUP BY AI_636.PARENT_ID 

此查詢是較大的查詢的一小部分,它會導致整個調用執行非常緩慢。優化InterBase查詢

基本上,有一個父操作,然後在它下面有幾個子操作。操作的估計與實際結束日期只存儲在子級別,因此爲了得到父級別的日期,我試圖找到子級別的最大日期。我碰到的問題是子操作沒有完成,它有一個NULL結束日期,並且MAX()函數忽略這些。我通過將子操作表加入其自身並將其縮小到只包括其兄弟姐妹都具有非空結束日期的子操作來解決此問題。

有什麼辦法可以優化搜索與非空結束日期的子項的父操作?

+0

決不IB的工作,但DISTINCT可能無關因爲`GROUP BY` – 2010-12-09 21:11:47

+0

你是對的,我更新了一下我的查詢並刪除了它。 – TheJubilex 2010-12-09 21:23:09

回答

0

我最後的答案有錯,但也許這將幫助:

AND NOT EXISTS (SELECT NULL 
       FROM AI_665 a2 
       WHERE a2.AP_1033 = a.AP_1033 
       AND a2.AP_3222 IS NULL) 
0

您必須創建一個降序索引,以加快MAX()