복붙노트

[SQL] 조건 내에서 JOIN 또는 WHERE

SQL

조건 내에서 JOIN 또는 WHERE

에 조건을 넣어의 차이 (성능, 모범 사례, 등 ...)가 WHERE 절 대 절을 조인?

예를 들어 ...

-- Condition in JOIN
SELECT *
FROM dbo.Customers AS CUS
INNER JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerID
AND CUS.FirstName = 'John'

-- Condition in WHERE
SELECT *
FROM dbo.Customers AS CUS
INNER JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerID
WHERE CUS.FirstName = 'John'

어느 당신이 선호하는 (그리고 아마도 그 이유)합니까?

해결법

  1. ==============================

    1.그래서 심지어 INNER이 (가) 과정을 가입하는 동안 그들은 이미 제외 할 수 있도록 조항이 옵티 마이저에 의해 rearrranged 술어를 가질 수 WHERE와 쿼리 가입하세요, 관계형 대수는 WHERE 절에서 술어의 호환성을 허용하고 내부는 가입하세요.

    그래서 심지어 INNER이 (가) 과정을 가입하는 동안 그들은 이미 제외 할 수 있도록 조항이 옵티 마이저에 의해 rearrranged 술어를 가질 수 WHERE와 쿼리 가입하세요, 관계형 대수는 WHERE 절에서 술어의 호환성을 허용하고 내부는 가입하세요.

    난 당신이 가능한 가장 읽기 쉬운 방식으로 쿼리를 작성하는 것이 좋습니다.

    때때로 이것은 내부가 상대적으로 "불완전"가입하고 단순히 더 쉽게 유지 보수 기준을 필터링의 목록을 만들기 위해 WHERE의 기준의 일부를 퍼팅이 포함되어 있습니다.

    예를 들어, 대신 :

    SELECT *
    FROM Customers c
    INNER JOIN CustomerAccounts ca
        ON ca.CustomerID = c.CustomerID
        AND c.State = 'NY'
    INNER JOIN Accounts a
        ON ca.AccountID = a.AccountID
        AND a.Status = 1
    

    쓰다:

    SELECT *
    FROM Customers c
    INNER JOIN CustomerAccounts ca
        ON ca.CustomerID = c.CustomerID
    INNER JOIN Accounts a
        ON ca.AccountID = a.AccountID
    WHERE c.State = 'NY'
        AND a.Status = 1
    

    그러나 물론, 따라 달라집니다.

  2. ==============================

    2.내부 조인을 위해 정말 차이를 발견하지 않았습니다 (그러나 모든 성능 조정과 마찬가지로, 당신은 당신의 조건에서 데이터베이스에 대해 확인해야합니다).

    내부 조인을 위해 정말 차이를 발견하지 않았습니다 (그러나 모든 성능 조정과 마찬가지로, 당신은 당신의 조건에서 데이터베이스에 대해 확인해야합니다).

    그러나 당신은 당신이 왼쪽 또는 오른쪽 조인 사용하는 경우 조건이 큰 차이를 만들어 넣어 곳. 예를 들어이 두 쿼리를 고려하십시오

    SELECT *
    FROM dbo.Customers AS CUS 
    LEFT JOIN dbo.Orders AS ORD 
    ON CUS.CustomerID = ORD.CustomerID
    WHERE ORD.OrderDate >'20090515'
    
    SELECT *
    FROM dbo.Customers AS CUS 
    LEFT JOIN dbo.Orders AS ORD 
    ON CUS.CustomerID = ORD.CustomerID
    AND ORD.OrderDate >'20090515'
    

    첫 번째는 당신에게 내부에 가입하여 왼쪽 변환 2009년 5월 15일 이후에 일 주문이 가입 만 기록을 제공 할 것입니다. 두 번째는 어떤 순서로 레코드 및 모든 고객에게 제공 할 것입니다. 결과 세트는 조건을 넣어 위치에 따라 매우 다르다. (선택 * 예를 목적으로 만, 당신은 생산 코드 물론 사용하지 말아야위한 경우.) 당신은 하나 개의 테이블에있는 레코드 만보고 싶어하지만 다른하지 않을 경우는 예외입니다. 그럼 당신은 가입하지 않는 조건 where 절을 사용합니다.

    SELECT *
    FROM dbo.Customers AS CUS 
    LEFT JOIN dbo.Orders AS ORD 
    ON CUS.CustomerID = ORD.CustomerID
    WHERE ORD.OrderID is null
    
  3. ==============================

    3.대부분의 RDBMS 제품은 동일하게 두 쿼리를 최적화합니다. 피터 Gulutzan와 트루디 Pelzer는에 의해 "SQL 성능 튜닝", 그들은 RDBMS의 여러 브랜드를 테스트하고 성능에 차이를 찾을 수 없습니다.

    대부분의 RDBMS 제품은 동일하게 두 쿼리를 최적화합니다. 피터 Gulutzan와 트루디 Pelzer는에 의해 "SQL 성능 튜닝", 그들은 RDBMS의 여러 브랜드를 테스트하고 성능에 차이를 찾을 수 없습니다.

    나는 조건이 쿼리 제한 조건에서 별도의 가입 유지하는 것을 선호합니다.

    당신은 OUTER를 사용하는 경우는이 절을 조인 조건을 넣어하는 것이 필요 때때로 가입하세요.

  4. ==============================

    4.(가) 발생에 가입하면 WHERE 필터링한다.

    (가) 발생에 가입하면 WHERE 필터링한다.

    온 필터는이 과정을 가입시 추가되는 행을 방지하기 위해 가입.

  5. ==============================

    5.나는이 WHERE 결과 세트의 술어를 소개하는을 사용하여 다음 전체 테이블 / 뷰에 가입 가입 및 선호합니다.

    나는이 WHERE 결과 세트의 술어를 소개하는을 사용하여 다음 전체 테이블 / 뷰에 가입 가입 및 선호합니다.

    이 구문 청소기를 느낀다.

  6. ==============================

    6.조인에 필터링 할 때 나는 일반적으로 성능 향상을 참조하십시오. 특히 당신은 두 테이블에 대한 인덱스 컬럼에 가입 할 수 있습니다. 논리적, 높은 볼륨 환경에서 대부분의 질의 인도이 일을 함께 실행 시간보다 훨씬 더 나은 성과 지표를 읽고에 당신은 줄일 수 있어야합니다.

    조인에 필터링 할 때 나는 일반적으로 성능 향상을 참조하십시오. 특히 당신은 두 테이블에 대한 인덱스 컬럼에 가입 할 수 있습니다. 논리적, 높은 볼륨 환경에서 대부분의 질의 인도이 일을 함께 실행 시간보다 훨씬 더 나은 성과 지표를 읽고에 당신은 줄일 수 있어야합니다.

    누군가가 자신의 SQL이 벤치마킹을 보여줍니다 때 항상 온화하게 즐겁게하고 있는데 그들은 dev에 서버 자정에 SPROC의 두 버전을 50,000 번 실행 평균 시간을 비교했습니다.

  7. ==============================

    7.그 "를"조인하지 무엇으로 조인의 조건을 두는 것은, 나에게 "의미 잘못"보인다. 그러나 그것은 매우 정성입니다.

    그 "를"조인하지 무엇으로 조인의 조건을 두는 것은, 나에게 "의미 잘못"보인다. 그러나 그것은 매우 정성입니다.

    추가 문제 : 당신이 내부에서 스위치에 결정하는 경우에, 말, 오른쪽은 예상치 못한 결과가 발생할 수 있습니다 가입 내부의 상태가 될 가지고, 가입 가입 할 수 있습니다.

  8. ==============================

    8.더 큰 테이블이있을 때 빨리 내 의견에 조인. 정말 당신은 오히려 작은 테이블을 다루고, 특히 비록 차이가 그렇게 많이하지 않습니다. 조인에 대해 처음 알게되었을 때, 나는 상호 교환 사용할 수 어디서 절 조건을 그와 같은 조인의 조건은 들었다 경우 절에 조건을 수행하는 어떤 테이블에 대한 특이 곳.

    더 큰 테이블이있을 때 빨리 내 의견에 조인. 정말 당신은 오히려 작은 테이블을 다루고, 특히 비록 차이가 그렇게 많이하지 않습니다. 조인에 대해 처음 알게되었을 때, 나는 상호 교환 사용할 수 어디서 절 조건을 그와 같은 조인의 조건은 들었다 경우 절에 조건을 수행하는 어떤 테이블에 대한 특이 곳.

  9. ==============================

    9.가입에 조건을 추가하는 것이 좋습니다. 성능 가독성보다 더 중요하다. 대규모 데이터 세트의 경우, 중요.

    가입에 조건을 추가하는 것이 좋습니다. 성능 가독성보다 더 중요하다. 대규모 데이터 세트의 경우, 중요.

  10. from https://stackoverflow.com/questions/1018952/condition-within-join-or-where by cc-by-sa and MIT license