2009-03-09 2 views
2

다른 테이블의 해당 행이있는 한 테이블의 모든 행을 선택한다고 가정합니다 (다른 테이블의 데이터는 중요하지 않으며 해당 행이있는 경우에만 해당) 중요하다). DB2에 대해 알고있는이 쿼리는 INNER JOIN이 아닌 EXISTS 절을 사용하여 상관 쿼리로 작성 될 때 더 나은 성능을 발휘합니다. SQL Server에서도 마찬가지입니까? 아니면 전혀 차이가 없습니까?SQL Server의 상관 쿼리와 내부 조인 성능

답변

2

방금 ​​테스트 쿼리를 실행했고 두 명령문은 완전히 동일한 실행 계획으로 끝났습니다. 물론, 모든 성능 질문에 대해 필자는 테스트를 자신의 환경에서 실행하는 것이 좋습니다. SQL Server Management Studio를 사용하면이 방법이 쉽습니다 (실행중인 2000이라면 SQL 쿼리 분석기). 두 문을 쿼리 창에 입력하고 쿼리 | 실제 쿼리 계획 포함을 선택하십시오. 그런 다음 쿼리를 실행하십시오. 결과 탭으로 이동하면 계획이 무엇인지, 어떤 계획이 더 높은 비용인지 쉽게 알 수 있습니다.

+0

글쎄, 내가 테스트하기에 적절하게 큰 DB가있는 경우에만 실행할 수는 있지만, 나는 그렇게 대답하지 않는다. 나는 테스트 할 무언가가있을 때 그렇게 할 것이다. –

1

이상한 점 :이 쿼리를 상관 쿼리로 작성하는 것이 일반적으로 더 자연 스럽습니다. 그 시점에서 필자는 SQL Server 옵티마이 저의 가능성이 높기 때문에 다시 돌아가서 조인을 사용하여 다시 조인해야합니다. 맞아.

그러나 너무 심각하게 생각하지 마십시오. 내가 여기있는 26K 대표와 유일한 2 현재 SQL 주제별 배지 중 하나, 나는 실제로 지식에 관해서는 꽤 중학교입니다 (그것은 볼륨에 관한 모든 것입니다!))); 확실히 나는 DBA가 아니다. 실제로는 실제 성능을 측정하기 위해 각 방법을 프로파일 링해야합니다. 옵티마이 저가 원하는 것을 인식하고 두 가지 쿼리를 최적의 방법으로 처리 할 것을 기대하지만, 확인할 때까지 결코 알 수 없습니다.

+0

OK, 이것도 나를 위해 작성하는 자연스러운 방법이지만, 이것은 주로이 DB2 편차 때문입니다.). 실제로 이것은 DB2 최적화 된 표정을 결함으로 만들었으며이를 인식 할 수 있어야합니다. –

+0

동의합니다. 필자는 대개 옵티 마이저가 상관 관계가있는 서브 쿼리보다 조인 시간이 더 길다는 것을 발견했습니다. 그러나 당신이 말하는 것처럼, 마일리지는 다를 수 있습니다. – mwigdahl

0

모두가주의 깊게 살펴 보았 듯이 최적화는 모두 끝납니다. 나는 당신에게 더 자연스러운 느낌을주고, 최적화 도구가 가장 효과적인 쿼리 계획 (통계 수집, 인덱스 생성 등)을 이해할 수 있도록 작성하는 것이 좋습니다. SQL Server Optimizer는 작업에 필요한 정보를 제공하는 한 전체적으로 꽤 좋습니다.

0

아마 가장 좋은 성능은 파생 테이블에 대한 조인입니다. Exists는 아마도 다음에있을 것입니다 (더 빠를 수도 있습니다). 최악의 성능은 선택 항목 내에서 서브 쿼리를 사용할 때와 같이 행 대신 행별로 실행되는 경향이 있습니다.

그러나 모든 것이 동일하고 데이터베이스 성능이 데이터베이스 디자인에 크게 좌우됩니다. 나는 모든 가능한 방법을 시험해보고 어떤 상황에서 더 빠를지를 보았습니다.

1

조인을 사용하십시오. 작은 테이블을 사용하는 경우 성능 차이를 크게 줄지는 못하지만 "외부"테이블이 매우 큰 경우 각 행에 대해 EXISTS 하위 쿼리를 수행해야합니다. 테이블이 공통 열에 대해 인덱싱 된 경우 내부 조인을 수행하는 것이 훨씬 더 빠릅니다. BTW, 두 번째 테이블에없는 모든 행을 찾으려면 LEFT JOIN을 사용하고 두 번째 테이블에서 NULL을 테스트하십시오. 매우 큰 테이블과 인덱스가있을 때 EXISTS를 사용하는 것보다 훨씬 빠릅니다.