2009-06-15 5 views
7

나는 두 개의 테이블이 있습니다T-SQL에서 필터링 또는 결합이 먼저 발생합니까?

Customers(Id, Name, TownId) T 
Towns(Id, Name) 

나는이 같은 SQL 문이 있습니다

SELECT * 
FROM Customers 
INNER JOIN Towns ON Towns.Id = Customers.TownId 
WHERE Customers.Id > 5 

것은 무엇 첫째 일어날 것입니까?
Customers 테이블을 필터링 한 다음 선택한 레코드를 Towns 테이블과 조인합니까?
모두 CustomersTowns과 결합하고 필터합니까? 아니면 말할 수 없습니까?

답변

15

옵티마이 저는 가장 빠르다고 생각하는 모든 것을 할 것입니다.

조인 힌트를 사용하여 특정 동작을 강제 실행하거나 통계 및 인덱스를 사용하여 특정 동작을 장려 할 수 있습니다. 하지만 일반적으로 Optimizer를 신뢰하는 것이 가장 좋습니다.

쿼리가 실행되는 방식에 대한 자세한 설명은 execution plan을 참조하십시오.

+3

특정 QEP를 "강제 적용"하는 일반적인 기술은 거의 모든 공급 업체에 따라 다르기 때문에 ... 효과적으로 공급 업체 고정을 달성합니다. 그 도끼를 조심해, 유진. – corlettk

+0

+1 핑크 플로이드. :-) – GuyBehindtheGuy

0

laymans 용어로 필터는 조인 전에 발생하므로 필터링하기 전에 두 테이블 모두를 조인하지 않습니다.

사용중인 도구 세트에 따라 실행 순서 및 각 단계의 비용을 확인하는 데 도움이되는 쿼리의 실행 계획을 표시하는 옵션을 찾아야합니다.

1

일반적으로 결합이 먼저 발생합니다. 고려 :

 
t1.id t1.foo  t2.id t2.bar t2.t1_id 
-------------  ------------------------ 
    1 'abc'   1 '123'   1 
    2 'def'   2 '456'   1 
    3 'ghi'   3 '789'   2 
    4 'jkl'   4 '0'  NULL 

이 쿼리는 :

SELECT 
    t1.foo, 
    t2.bar 
FROM 
    t1 
    LEFT JOIN t2 ON t1.id = t2.t1_id 
WHERE 
    t2.somevalue IS NOT NULL 

이 산출됩니다

 
foo  bar 
------------- 
'abc' '123' 
'abc' '456' 
'def' '789' 

당신이 조인 조건으로 필터를 당길 때, 필터링이 결합뿐만 아니라에서 발생하는 반면 :

SELECT 
    t1.foo, 
    t2.bar 
FROM 
    t1 
    LEFT JOIN t2 ON t1.id = t2.t1_id AND t2.somevalue IS NOT NULL 

:

 
foo  bar 
------------- 
'abc' '123' 
'abc' '456' 
'def' '789' 
'ghi' NULL 
'jkl' NULL 

쿼리가 복잡해지면 테이블이 조인되기 전에 실행 계획에 의해 필터링되는 레코드가 무엇인지 쉽게 구분할 수 없게됩니다.

+0

내 질문에 대한 답변이 정확하지 않습니다. 내 사례에서 항상 가입이 항상 먼저 이루어 지도록 보장 할 수 있습니까? – agnieszka

+0

* * 예제에서는 내부 조인을 사용하기 때문에 아무런 차이가 없습니다. 먼저 필터링 - 나중에 참여하거나 그 반대의 경우, 어떤 일을해도 결과 집합이 달라지지 않습니다. 가장자리 경우에는 외부 조인이 있습니다. – Tomalak

+0

결과에 차이는 없지만 효율성에는 차이가 있습니다.어쨌든 중요하지 않습니다. 반환 된 결과가 같아도 무엇이 먼저 발생하는지 알고 싶습니다. – agnieszka

0

쿼리를 병합 조인으로 사용하면 필터링과 조인이 동시에 수행됩니다.

관련 문제