Оптимизация запроса InterBase

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

Этот запрос является небольшой частью более крупного запроса, поэтому весь вызов выполняется очень медленно.

По сути, есть родительская операция, а затем несколько дочерних операций под ней. Предполагаемые и фактические даты окончания операций хранятся только на дочернем уровне, поэтому, чтобы получить один для родительского уровня, я пытаюсь найти самые большие даты на дочернем уровне. Проблема, с которой я сталкиваюсь, заключается в том, что дочерняя операция не завершена, она имеет дату окончания NULL, а функция MAX() игнорирует их. Я обхожу это, присоединяя таблицу дочерних операций к самой себе и сужая ее, чтобы включать только дочерние операции, все родственные элементы которых имеют даты окончания, отличные от NULL.

Есть ли способ оптимизировать поиск родительских операций с дочерними элементами с датами окончания, отличными от NULL?


person TheJubilex    schedule 09.12.2010    source источник
comment
Никогда не работал с interbase, но DISTINCT, скорее всего, не имеет значения из-за GROUP BY   -  person OMG Ponies    schedule 10.12.2010
comment
Вы правы, я немного обновил свой запрос и удалил его.   -  person TheJubilex    schedule 10.12.2010


Ответы (2)


В моем последнем ответе была ошибка, но, возможно, это поможет:

AND NOT EXISTS (SELECT NULL
                FROM   AI_665 a2
                WHERE  a2.AP_1033 = a.AP_1033
                AND    a2.AP_3222 IS NULL)
person Parris Varney    schedule 09.12.2010
comment
Нет, потому что это только проверяет, не является ли текущая строка нулевой. Дополнительный подзапрос проверяет все строки на наличие определенного AP_1033. - person TheJubilex; 10.12.2010
comment
Ааа, имеет смысл. Вы пробовали НЕ СУЩЕСТВУЕТ? Я обновил свой комментарий. - person Parris Varney; 10.12.2010
comment
Это помогло немного ускорить его, но он все еще намного медленнее, чем мне хотелось бы, по большому счету. - person TheJubilex; 10.12.2010

Вы должны создать нисходящий индекс, чтобы ускорить MAX()

person r_j    schedule 26.04.2013