2014-11-04 2 views
0

뷰인 테이블에서 2 열에 대해 null이 아닌 쿼리를 찾을 수 있으므로 실행에 많은 시간이 걸립니다. 쿼리는 다음과 같습니다 Query1을찾기 COALESCE를 사용하여 여러 열에 null이 아님

SELECT [Table1].M, [[Table1]].B, [Table1].P 
FROM [Table1] 
WHERE ((([[Table1]].B) Is Not Null) AND (([[Table1]].P) Is Not Null)); 

은 아래의 쿼리를 빠르게 실행 시간에 Query1 같이 동일한 기능을 수행합니까?

SELECT [Table1].M, [[Table1]].B, [Table1].P 
FROM [Table1] 
WHERE COALESCE (([[Table1]].B),([[Table1]].P)) Is Not Null 

어떤 도움을 주셔서 감사드립니다.

select dbo.TABLE1.[COL1] 
    , dbo.TABLE1.[COL2] 
    , RIGHT(dbo.TABLE1.M, 12) as M 
    , dbo.TABLE2.[MD] 
    , dbo.TABLE1.[COL3] 
    , dbo.TABLE1.[COL4] 
    , dbo.TABLE3.COL1 
    , dbo.TABLE3.[COL2] 
    , dbo.TABLE3.[COL3] 
    , dbo.TABLE4.[COL1] 
    , dbo.TABLE5.[COL1] 
    , dbo.TABLE6.[COL1] 
    , dbo.TABLE7.[COL1] as [BA] 
    , dbo.TABLE8.[COL1] 
    , dbo.TABLE3.[COL4] 
    , dbo.TABLE3.[COL5] 
    , dbo.TABLE3.[COL6] 
from dbo.TABLE1 
left outer join dbo.TABLE2 
    on dbo.TABLE1.M = dbo.TABLE2.M 
left outer join dbo.TABLE3 
    on dbo.TABLE1.M = dbo.TABLE3.M 
left outer join dbo.TABLE5 
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE5.OBJ 
left outer join dbo.TABLE6 
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE6.OBJ 
left outer join dbo.TABLE7 
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE7.OBJ 
left outer join dbo.TABLE4 
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE4.OBJ 
left outer join dbo.TABLE8 
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE8.OBJ 
where (
     (
      dbo.TABLE1.[COL1] not in (
       'XX' 
       , 'YY' 
       ) 
      ) 
     and (dbo.TABLE1.COL5 = 'x') 
     ) 
+0

그것은 아마 모든 괄호를 운동 반 시간을 보내는 것 :

당신은 여기 설치에 적합한 인덱스를 얻을 수있는 몇 가지 테스트를 수행하지만해야 할 수 있습니다

내가 변경 일의 샘플입니다. ;) –

+0

더 심각하게, 테스트 데이터를 작성하고 전제가 정확한지 확인해 보셨습니까? 몇 천 번 실행하고 출력 및 실행 시간 등을 확인하십시오. –

+0

저는 아마추어가 이런 포럼을 통해 내 속임수를 배우고 있습니다. 이런 상황에 접근하는 방법에 대한 아이디어를 얻으면 큰 도움이 될 것입니다. 감사합니다 – AllPigsREqual

답변

2

뷰 쿼리 아니, 두 쿼리는 해당되지 않습니다.

번째의 절 WHERE 첫번째 파라미터를 평가하고 널이 아닌 경우를 반환

WHERE [[Table1]].B Is Not Null OR [[Table1]].P Is Not Null 

COALESCE 동일하다. 그렇지 않으면 null이 아닌 경우 두 번째 매개 변수를 반환하고 마지막 매개 변수에이를 때까지 계속 매개 변수 값을 반환합니다. 따라서 COALESCE(...) IS NOT NULL은 모두를 반환하는 것이 아니라 하나의 null이 아닌 값만 필요합니다.

+0

저를 바로 잡아 주셔서 감사합니다. 여러 열에 대해 null이 아닌 것을 찾는 함수를 사용할 수있는 방법이 있습니까? – AllPigsREqual

+0

나는 그렇게 생각하지 않는다. 어쨌든'NOT NULL' 테스트가 병목 현상이라고 여기는 것은 의심 스럽습니다. 인덱스는 어떻게 생겼습니까? 당신 테이블은 얼마나 큽니까? –

+0

내 테이블은 약 3 백만 레코드입니다. 나는 스키마를 가지고 있지 않으므로 뷰를 정교하게 포함해야한다. – AllPigsREqual

0

저는 이것을 개발 DB의 테이블에서 시험해 보았습니다. 3 선택한 열 1.8 초 (그들 PK의 없음)에 800 만 테이블 인덱스

중 400 만 개 선택한 레코드에 대한 이분 : 만 PK 인덱스

다음은 결과입니다.

select [col1] 
    , [col2] 
    , [col3] 
from [dbo].[tbl] 
where col2 is not null 
    and col3 is not null 

create nonclustered index [idx_test] on [dbo].[tbl] (
    [col2] asc 
    , [col3] asc 
    ) INCLUDE ([col1]) 
+1

내 테이블이 뷰이고 조인이 포함되어 있기 때문에 조인을 만들 수 없습니다. "LEFT, RIGHT 또는 FULL OUTER 조인을 사용하고 인덱스 된 뷰에서 OUTER 조인을 사용할 수 없기 때문에 뷰"xxx "에서 인덱스를 만들 수 없습니다. 대신 INNER 조인을 사용하십시오." – AllPigsREqual

+0

@Lewan a view isnt 테이블. 뷰는 테이블을 봅니다. 보기에 표시된 표에 색인을 작성하십시오. – Tristan

+0

뷰에서 사용하는 대부분의 테이블에서 pirmary 키에 대한 인덱스가 있습니다. 내 생각에 외부 조인이 포함되어 있기 때문에 내가 할 수없는 인덱스 뷰를 가질 수 있을지 생각하고있었습니다. 이 질문에 맞게 여러 쿼리를 다시 작성하고 싶지는 않습니다. – AllPigsREqual

관련 문제