2012-11-09 1 views
0
 `select * from DETAIL a 
     where a.BUILD > GETDATE() - 90 s 
     and (a.IN + a.Rt) NOT IN (SELECT Sample_IN + Rt FROM SUMMARY)     
     and (a.Rt + a.Err) IN 
     (SELECT Rt + Err 
     FROM SUMMARY 
     where (sample_in + rt + err) NOT IN 
     (SELECT in + rt + err FROM DETAIL)) 
     group by a.rt, a.plant, a.in, a.build` 

이 쿼리는 성능 문제를 보여 주며 sql2000 서버에서 더 빠르게 실행되지만 sql2008R2에서는 성능이 떨어집니다. 두 환경의 테이블은 동일한 특성 (컬럼 데이터 유형 및 색인)을 갖습니다. select 절에 대한 "+"연산자에 약간의 가능성이 있다고 생각합니다. 누구든지 나를 도울 수 있습니까?SQL 하위 쿼리 및 조인 성능 문제

+0

저는 sqlserver에 익숙하지 않아서 할 수 있는지 모르겠지만 (a.in, a.Rt) (select sample_IN, SUMMARY에서 Rt)을 사용하지 마십시오. – sufleR

답변

3

필드를 연결할 때 인덱스가 작동하지 않습니다. 이미 필드를 결합 할 수있는 열을 테이블에 작성하고 해당 필드에 색인을 작성할 수 있습니다. 이것은 당신의 공연을 향상시킬 것입니다.

는 또한,이 쿼리는 빠르게 실행하고 현재 인덱스를 사용 않습니다 (오타 용서, 당신은 테이블 정의를 포함하지 않았다) : 이것은 사용

select * 
    from DETAIL a 
where a.BUILD > DateAdd(Day, -90, GetDate()) 
    and not exists (select null 
         from SUMMARY 
        where SUMMARY.Sample_IN = a.IN and SUMMARY.Rt = a.Rt) 
    and exists (select null 
       from SUMMARY 
       where not exists (select null 
            from DETAIL 
            where DETAIL.in = SUMMARY.Sample_IN 
             and DETAIL.Rt = SUMMARY.Rt 
             and DETAIL.Err = SUMMARY.Err) 
        and a.Rt = SUMMARY.Rt 
        and a.Err = SUMMARY.Err) 
group by a.rt, a.plant, a.in, a.build 
+0

Hello @ 제안을위한 dominic 주셔서 감사합니다. 위의 쿼리는 sql2000 서버에서 정상적으로 실행되지만 sql2008 서버에 문제가 있습니다. 이에 대해 어떤 생각이 있습니까 ?? 연결된 열은 문자 유형입니다. 두 서버의 테이블은 동일한 특성을 갖습니다. – Vignesh

0
select * from DETAIL a 
    left outer join SUMMARY sm1 
     on a.IN = sm1.Sample_IN 
    and a.Rt = sm1.Rt 
    join SUMMARY sm2 
     on a.Rt = sm2.Rt 
    and a.Err = sm2.Err 
    left outer join Detail d 
     on sm2.Sample_IN = d.in 
    and sm2.rt = d.rt 
    and sm2.err = d.err 
    where a.BUILD > GETDATE() - 90 s 
    and sm1.Rt is null 
    and d.in is null 
    group by a.rt, a.plant, a.in, a.build 

조인. 도미닉 굴레 (Dominic Goulet)의 문제로 인해 더 잘 작동 할 것입니다. +1

+0

감사합니다 @ 블람, 내 의심은 sql2000에서 잘 실행되는 동일한 쿼리이지만 왜 sql2008에서 실패합니까 .. 내가 거기에 설정 관련 문제가있을 것 같아 .. 당신이 날 안내해 줄 수 있을까요? – Vignesh

+0

SQL2008에서 동일한 인덱스를 사용하고 있습니까? 쿼리 계획을 비교하고 다른 쿼리 계획을 확인하십시오. – Paparazzi

+0

두 서버에서 모두 동일한 인덱스가 사용됩니다. 여전히 문제가 지속됩니다 – Vignesh