Оптимизировать InterBase Query - PullRequest
0 голосов
/ 10 декабря 2010
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 () игнорирует их. Я могу обойти это, присоединив дочернюю таблицу операций к себе и сузив ее так, чтобы она включала только дочерние операции, у братьев и сестер которых есть не конечные даты окончания.

Можно ли как-нибудь оптимизировать поиск родительских операций с дочерними элементами с не конечными датами окончания?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2013

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

0 голосов
/ 10 декабря 2010

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

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