2013-08-06 2 views
0

로컬에서는이 쿼리가 로컬 컴퓨터에서 올바르게 실행되지만 클라이언트 측에서는 실행 계획이 다른 경우 약 3 분이 소요됩니다.
색인, 통계 등을 다시 작성했습니다. 이로 인해 시간이 2시 15 분으로 단축되었습니다.
조사한 결과 문제가 라인에서 시작하는 성명서를 중심으로 돌아가고 있다는 것을 알게되었습니다. AND (a.p = '123456789' or ... 대신 공용체를 사용하도록 쿼리를 재구성하면 쿼리에 < 초가 걸리게됩니다.
그래서 클라이언트가 2 분 이상 점프 할 시간이 생기는 이유는 무엇입니까?SQL 'OR'로 인해 시간이 초과되었습니다.

select * 
from foo_main A with(nolock) 
where a.i = a.i 
and (IsNull(A.v, '0') = '1') 
and (IsNull(A.d, '') = 'CODE_B') 
and A.c in ('CODE_B') 
AND (a.p = '123456789' or 
a.p IN (SELECT DISTINCT f.ui 
    FROM foo_faculty f 
    LEFT JOIN foo_unit ff ON (f.ui = ff.ui) 
    LEFT JOIN unit u ON (ff.ui = u.ui AND 
     f.c = u.c), 
    foo_Personnel p, foo_System s, unit u1 
    WHERE s.P = p.P 
    AND s.s = 'G' 
    AND s.R = 'R4' 
    AND p.ui = '1q2w3e4r5t6y' 
    AND p.ui = u1.ui 
    AND p.i = u1.i 
    AND u.i = u1.i 
    AND u.dI LIKE u1.DI + '%' COLLATE 
    SQL_Latin1_General_CP1_CS_AS)) 
order by lname, fname 

감사합니다.

죄송 합니다만, select *은 원래 코드에 포함되어 있지 않습니다. 나는 모든 사람이 그 진술이나 문장을 더 쉽게 찾을 수 있도록 코드의 양을 최소화하기 위해 그것을 변경했다.

+0

1) select *는 모든 열/데이터를 표시하고 많은 시간을 먹습니다. 2) 왼쪽 조인을 사용하는 경우 올바른 테이블에없는 데이터의 후속 작업 일 수 있습니다. 그러면 왼쪽 조인 문 내에서 where 절이 아닌 필터를 지정해야합니다. 3) 아마도 where 절은 왼쪽 테이블에서 일치하는 항목이 없는지를 원칙적으로 알고 싶어하는 오른쪽 테이블의 null 값만 필터링해야합니다. 4) where 절을 통해 조인되지 않고 내부 조인 (ON)을 명시 적으로 사용하십시오. (조인 최적화) – maSTAShuFu

답변

0

IN() 절 대신 JOINS를 사용하십시오.

관련 문제