2010-12-09 6 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 

Diese Abfrage ist ein kleiner Teil eines größeren und führt dazu, dass der gesamte Aufruf sehr langsam ausgeführt wird.Optimieren einer InterBase-Abfrage

Im Grunde gibt es eine übergeordnete Operation und dann mehrere untergeordnete Operationen darunter. Die geschätzten vs. tatsächlichen Enddaten der Operationen werden nur auf der untergeordneten Ebene gespeichert. Um eine für die übergeordnete Ebene ableiten zu können, versuche ich, die größten Daten auf der untergeordneten Ebene zu finden. Das Problem, auf das ich stoße, ist, wenn eine untergeordnete Operation nicht abgeschlossen ist, ein NULL-Enddatum vorliegt und die Funktion MAX() diese ignoriert. Ich umgehe das, indem ich die child-operations-Tabelle mit sich selbst verknüpfe und sie auf nur untergeordnete Operationen beschränke, deren Geschwister alle nicht-NULL-Enddaten haben.

Gibt es eine Möglichkeit, die Suche nach übergeordneten Operationen mit Kindern mit nicht-NULL Enddaten zu optimieren?

+0

nie mit ınterbase gearbeitet, aber die DISTINCT ist wahrscheinlich irrelevant wegen der 'GROUP BY' –

+0

Sie haben Recht, ich habe meine Anfrage ein wenig aktualisiert und entfernt. – TheJubilex

Antwort

0

Meine letzte Antwort hatte einen Fehler gemacht, aber vielleicht wird dies dazu beitragen:

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

Nein, weil nur überprüft wird, ob die aktuelle Zeile nicht null ist. Die zusätzliche Unterabfrage prüft alle Zeilen auf einen bestimmten AP_1033 – TheJubilex

+0

Aah, sinnvoll. Hast du ein NOT EXISTS versucht? Ich habe meinen Kommentar aktualisiert. –

+0

Das hat dazu beigetragen, es ein wenig zu beschleunigen, aber es ist immer noch viel langsamer, als ich im großen Schema der Dinge gerne hätte – TheJubilex

0

Sie müssen einen absteigenden Index erstellen, die MAX zu beschleunigen()