문제

편집 중에 Where 절을 사용하여 Where 절을 사용하는 쿼리를 어떻게 얻을 수 있습니까? 수동으로 다시 작성하면 Union을 사용하는 쿼리는 단일 쿼리보다 100 배 빠릅니다. Union의 각 쿼리에서 다른 지수를 효과적으로 사용할 수 있기 때문입니다. 이 접근법을 사용하게 할 수있는 방법이 있습니까?

다음과 같이 보이는 쿼리가 있습니다.

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3
where conditions1 
    and ((@param1 is null and cond3a) or (cond3b))

ColumnList, Joincond2, Joincond3 및 Condition1이 모두 더 이상 표현식 인 경우. 키커는 OR의 조건 중 하나만이 사실이라는 것입니다.

나는 처음으로 연합을 할 수 있다고 생각했지만 앞으로 많은 유지 보수가 필요한 20 개 정도의 SQL 라인 인 ColumnList, Joincond2, Joincond3 및 Condition1을 반복하고 있습니다. 내가 공급할 수있는 힌트 또는 Where 절을 작성하는 더 좋은 방법이 있습니까? 미리 감사드립니다.

도움이 되었습니까?

해결책

당신은 그룹화 할 수 있습니다

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3

견해로 나서 노조를 사용하십시오.

그러나 SQL2005/8으로 마이그레이션 할 수 있다면 공통 테이블 표현식을 사용할 수 있습니다.

with cte ( columnlist )
as (
    select columnlist
    from table1
    join table2 on joincond2
    join table3 on joincond3 )
select columnlist from cte where ...
union
select columnlist from cte where ...

다른 팁

쿼리에 옵션 (다시 컴파일)을 추가 해보십시오. 저장된 절차에 있으면 다시 컴파일을 추가하십시오. Query SQL Server를 실행 한 것은 처음으로 계획을 제시하고 캐시를 캐시하지만 두 번째는 여전히 이전 (그리고 현재 가난한) 쿼리 계획을 사용하고 있습니다.

쿼리를 사용할 때마다 다시 컴파일해야하므로 사소한 인기를 얻을 수 있지만 불량한 계획의 사용과 비교할 때 미미합니다.

편집 : SQL 2000의 저장된 절차에서 Recompile과 함께 사용하는 것이 항상 제대로 작동하지 않는다는 것을 읽었습니다. 버그는 아마도 SQL 2005에서 고정 된 것으로 추정됩니다. 그래도 버그를 개인적으로 만난 적이 없으므로 정확한 거래가 무엇인지 모르겠습니다. 그래도 시도해보십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top