优化InterBase查询

时间:2010-12-09 21:08:01

标签: sql query-optimization 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结束日期的子项?

2 个答案:

答案 0 :(得分:0)

我的上一个回答有一个错误,但也许这会有所帮助:

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

答案 1 :(得分:0)

您必须创建降序索引以加速MAX()