2009-09-11 2 views
0

이의 우리가
SELECT * FROM A INNER JOIN B ON [....] INNER는

A 2 행과 BA에 연결된 2 개 행을 포함하여 100 만 행이 포함되어있다 가정하고 있다고 가정 해 봅시다 곳 조인 된 테이블에 조인 # 행의 "2 오른쪽?

나는 테이블 BWHERE을 추가 할 경우 : WHERE 실제로 가입하기 전에 실행됩니다
SELECT * FROM A INNER JOIN B ON [....] WHERE B.Xyz > 10

... 그래서 만약 여기서 반환 1000 행, B의 "행의 실제 #" 1000이 될 것입니다 ... 나는 그것을 얻지 못합니다 .. 안된다 < = 2 ???

내가 누락 된 부분은 무엇입니까? 왜 옵티마이 저는 그런 식으로 진행됩니까? 최적화는 생각 중 방식으로 진행됩니다 (SQL 2008)

감사

+0

테이블 A에 B보다 많은 행이 포함되어 있기 때문에 가능하다고 생각합니다. 나는 A가 많은 행을 가지고 있다고 언급하지 않았다. –

답변

2

가 빠릅니다. 즉, Xyz 열이 인덱싱되었지만 조인 열이 인덱싱되지 않으면 xyz 필터가 먼저 수행됩니다. 또는 통계가 좋지 않아 조인 필터가 B 행을 두 행으로 줄일 수 없다는 것을 모를 경우 먼저 WHERE 절을 사용합니다.

1

이는 인덱스가 사용할 수있는 인덱스를 기반으로합니다. 또한 db 엔진이 쿼리의 다른 부분 전에 WHERE를 실행한다고 믿을만한 이유가 없습니다. 쿼리 최적화 프로그램은 올바른 결과가 반환되는 한 원하는 순서대로 쿼리를 실행할 수 있습니다. 이러한 유형의 쿼리를 적절하게 최적화하는 방법은 전략적으로 배치 된 인덱스를 사용하는 것입니다.

0

"한 번만 스캔했습니다"는 약간의 오해입니다. 테이블 스캔은 SQL Server에서 끔찍한 비싼 것입니다. 적어도 SS2005까지, 테이블 스캔은 임시 테이블에 모든 행을 읽은 다음 조인 조건과 일치하는 행을 찾기 위해 임시 테이블을 읽어야합니다. 따라서 최악의 경우 쿼리의 결과는 이고, 1M 행으로 작성한 다음 2 행을 1M 행으로 일치시킨 다음 임시 테이블을 삭제하십시오. 마지막 비트는 아마도 쿼리의 가장 저렴한 부분 일 것입니다. 따라서 B에 사용 가능한 색인이 없으면 나쁜 장소에 있습니다.

두 번째 예에서 B.Xyz의 색인이 생성되지 않으면 의 2 차 일치가 발생하여 효율성이 떨어집니다. B.Xyz 인 경우 색인 조회와 2 : 1000 일치가 있어야합니다. 훨씬 더 빨리 &이 더 빠릅니다.

'물론 테이블 통계는 비교적 최신이며 옵티 마이저의 작동 방식을 변경하는 옵션은 없다고 가정합니다.

EDIT : A 행을 "풀어서"B의 no-JOIN 쿼리에서 정적 조건으로 사용할 수 있습니까? 우리는이 애플리케이션을 작은 테이블 (1003 행)을 작은 테이블 (1003 행)과 큰 테이블을 결합하는 두 곳에서 사용했습니다.