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

Cette requête est une petite partie d'une requête plus importante qui provoque l'exécution de l'appel entier très lentement.Optimisation d'une requête InterBase

Fondamentalement, il y a une opération parent puis plusieurs opérations enfants en dessous. Les dates de fin estimées et réelles des opérations ne sont stockées qu'au niveau de l'enfant, donc pour en déduire un pour le niveau parent, j'essaie de trouver les dates les plus importantes au niveau de l'enfant. Le problème que je rencontre est quand une opération enfant n'est pas terminée, il a une date de fin NULL, et la fonction MAX() les ignore. Je contourne cela en joignant la table des opérations enfants à elle-même et en la réduisant pour inclure uniquement les opérations enfants dont les frères et sœurs ont tous des dates de fin non NULL.

Est-il possible d'optimiser la recherche d'opérations parentes avec des enfants avec des dates de fin non NULL?

+0

jamais travaillé avec ınterbase, mais le DISTINCT est probable non pertinent en raison du 'GROUP BY' –

+0

Vous avez raison, j'ai mis à jour ma requête un peu et l'ai enlevé. – TheJubilex

Répondre

0

Ma dernière réponse avait une erreur, mais peut-être cela vous aidera:

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

Non, car cela vérifie seulement si la ligne courante n'est pas nulle. La sous-requête supplémentaire vérifie toutes les lignes pour un certain AP_1033 – TheJubilex

+0

Aah, a du sens. Avez-vous essayé un NON EXISTS? J'ai mis à jour mon commentaire. –

+0

Cela a permis de l'accélérer un peu, mais il est encore beaucoup plus lent que je voudrais dans le grand schéma des choses – TheJubilex

0

Vous devez créer un index descendant pour accélérer le MAX()