1

업데이트

이 질문은 시기상조라고 생각합니다. 몇 가지 테스트를 더 거친 후에 성능이 향상되지 않았 음을 알게되었습니다. 몇 가지 테스트를 추가로 수행하고 업데이트를 게시합니다. 그때까지, 이걸 귀찮게 대답하지 마라.SQL 쿼리 UNION 성능

나는이 같은 쿼리 ...

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE [Field_A] NOT IN (SELECT bo.[Id] 
         FROM [BusinessObject_Table] bo 
         UNION 
         SELECT boTemp.[Id] 
         FROM [#BusinessObject_Table] boTemp) 

이 쿼리는 꽤 큰 데이터 세트에 대한 실행하는 데 영원히 소요했다. 또한 일부 성능 향상을 가져온 Temp 테이블의 Id 열에 CLUSTERED 인덱스를 추가했으나 완료하지 못했습니다.

나는이 초에 완성이이 쿼리 ...

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE [Field_A] NOT IN (SELECT bo.[Id] 
         FROM [BusinessObject_Table] bo) 
     AND [Field_A] NOT IN (SELECT boTemp.[Id] 
          FROM [#BusinessObject_Table] boTemp) 

를 교체했다. 누군가 여기서 일어난 일을 설명 할 수 있습니까?

업데이트 : 나는 두 쿼리가 모두 같다고 생각했습니다. 이것이 내가 필요한 것입니다.

BusinessObject_Table has following Ids: 1, 2, 3

#BusinessObject_Table has: 3, 4, 5

TempTable has rows whose Field_A values are: 1, 2, 3, 4, 6

쿼리의 결과는해야한다 : 6 (위의 쿼리에서 주 변화)

내가 쿼리 계획 및 사후을 얻기 위해 노력할 것입니다 여기에. 서브 쿼리의 쿼리 계획의 부재에서 추측

+1

계획을 게시하십시오. 쿼리는 어쨌든 다른 일을합니다. 두 번째 테이블은 두 테이블 모두에 나타나지 않는지 확인합니다. 첫 번째 테이블. 첫 번째는 'intersect'또는 두 번째'or '를 사용해야합니다. –

답변

3

...

UNION에서는 DISTINCT를 강제로. 별도의 IN 절을 사용하면이를 피할 수 있습니다. 그러나 논리는 쿼리 사이의 다른 (편집 : 마틴 스미스가 언급 한 바와 같이)

UNION ALL로

과 더 나은해야 단일이 논리는 경우

WHERE [Field_A] NOT IN (SELECT bo.[Id] 
        FROM [BusinessObject_Table] bo 
        UNION ALL 
        SELECT boTemp.[Id] 
        FROM [#BusinessObject_Table] boTemp) 
2

을 원하는 나는 당신이해야한다고 생각

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE NOT EXISTS(
    SELECT 1 FROM BusinessObject_Table bo WHERE #TempTable.FieldA = bo.Id 
) AND NOT EXISTS(
    SELECT 1 FROM #BusinessObject_Table bo WHERE #TempTable.FieldA = bo.Id 
) 

이렇게하면 SQL Server는 UNIONED 쿼리보다 약간 더 나은 옵티 마이저를 사용할 수 있습니다. 옵티마이 저가 인덱스 전략과 테이블 크기에 따라 다른 순서로 쿼리를 실행하도록 선택할 수 있습니다. 대부분이 작업을 수행하는 가장 빠른 방법 일 것입니다. 테이블 구조와 인덱스 및 실행 계획이 없어도 확실하지는 않습니다.

+0

감사합니다. 쿼리가 빨라졌습니다. 나는 이것을 시험 할 것이며, 나중에 실행 계획과 함께 더 많은 의견을 게시 할 것이다. – Zuber