2

パフォーマンスの問題を引き起こしている相関サブクエリがあります。相関サブクエリであるため、インデックス ヒントも受け入れません。そのため、代わりに JOIN に変換しようとしています。元のクエリと変更されたクエリを以下に示します。変更されたクエリは行を返しませんが、元のクエリは 224 行を返します。

この場合、サブクエリの代わりに JOIN を使用することが理にかなっている場合でも、私の JOIN クエリの何が問題なのかについての洞察に感謝します。ありがとう。

select Area_CODE,
       due_DATE,
       RATE,

from SCHED S
where (s.Area_CODE = 11001 and 
   (s.COMP_CODE = 'a' 
   or
      (s.COMPANY_CODE = 'b' 
          and s.due_DATE <
          (
           select
               nvl( min(s1.due_DATE), to_date  ( '31-DEC-2999', 'DD-MM-YYYY') )
               from   SCHED s1
               where  s1.AREA_CODE = s.AREA_CODE 
               and s1.COMP_CODE = 'c'
          )
       )
    )
   )
order by a.EFF_DATE asc, s.due_DATE asc

変更されたクエリ:

SELECT
  Area_CODE,
       due_DATE,
       RATE

from SCHED S
LEFT JOIN
  (
    SELECT
      NVL( MIN(s1.due_DATE), to_date ( '31-DEC-2999', 'DD-MM-YYYY') ) AS
      min_date,
      s1.AREA_CODE AS a_code
    FROM
      SCHED s1
    WHERE
      s1.COMPANY_CODE = 'c'
    GROUP BY
      s1.AREA_code
  )
  s2
ON
  s2.A_CODE = s.area_code
WHERE
  (
    s.area_code = 11001
  AND
    (
      s.COMP_CODE = 'a'
    OR
      (
        s.COMP_CODE = 'b' 
      and s.due_DATE < s2.min_date
      )
    )
  )
order by s.EFF_DATE asc, s.due_DATE asc
4

1 に答える 1

0

違いは、特定の市外局番の日付がない場合です

左側の結合(s2)を内側の結合に変更します

inner JOIN 
( 
    SELECT 
        min(s1.due_DATE) AS min_date, 
        s1.AREA_CODE AS a_code 
    FROM 
        (
            select Area_Code, due_date from SCHED WHERE COMPANY_CODE = 'c' 
            union
            select Area_Code, to_date('31-dec-2999','DD-MM-YYYY') from SCHED
        ) s1    
    GROUP BY 
        s1.AREA_code 
) s2 
于 2012-07-19T21:47:46.467 に答える