복붙노트

[SQL] 에서 SQL 필터 기준은 기준을 가입하거나 더 효율적으로 절이고있는

SQL

에서 SQL 필터 기준은 기준을 가입하거나 더 효율적으로 절이고있는

나는 두 개의 테이블을 조인 비교적 간단한 쿼리가 있습니다. 은 "어디"기준은이 기준을 조인 또는 where 절과 같이 하나 표현 될 수있다. 나는 더 효율적이다 궁금하네요.

쿼리가 추진 될 때까지 시간의 처음부터 영업 사원에 대한 최대 판매를 찾는 것입니다.

사례 1

select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales  on salesman.salesmanid =sales.salesmanid 
                  and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid 

사례 2

select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales  on salesman.salesmanid =sales.salesmanid 
where sales.salesdate < salesman.promotiondate
group by salesman.salesmanid 

참고 사례 1은 모두 where 절 부족

RDBMS 2005은 SQL Server입니다

편집하다 의 두 번째 조각이 기준 또는 가입하면 절이었다 sales.salesdate <두 개의 테이블을 조인의 그것 실제로 어떤 기준 때문에 어떤 고정 된 날짜가 그 변화에게 답을하지 곳.

해결법

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

    1.나는 여기에 결정적인 요소로 성능을 사용하지 것이다 - 그리고 솔직히, 난 정말 그 이가지 경우 사이에 측정 가능한 성능 차이가 있다고 생각하지 않습니다.

    나는 여기에 결정적인 요소로 성능을 사용하지 것이다 - 그리고 솔직히, 난 정말 그 이가지 경우 사이에 측정 가능한 성능 차이가 있다고 생각하지 않습니다.

    나는 항상 케이스 # 2를 사용합니다 - 그 이유는 무엇입니까? 내 의견으로는, 당신은 단지 설립 실제 기준을 두어야하기 때문에이 절을 가입으로 두 테이블 사이에 가입 - 다른 모든 WHERE 절에 속한다.

    자신이 속한 곳 IMO, 일을 깨끗하게 일을 유지하고 넣어의 문제.

    물론, LEFT OUTER를 가진 경우가 기준의 위치가 결과를 반환받을 어떤 측면에서 차이를 만들 않는 경우 조인입니다 - 이러한 경우는 물론, 나의 추천에서 제외됩니다.

    즙을 짜고 난 찌꺼기

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

    2.당신은 그들이 서로 스택 방식을 볼 수있는 실행 계획의 추정 및 SQL 프로파일 러를 실행할 수 있습니다.

    당신은 그들이 서로 스택 방식을 볼 수있는 실행 계획의 추정 및 SQL 프로파일 러를 실행할 수 있습니다.

    그러나, 그들은 의미 론적으로이 SQL 서버 MVP에 따라 후드 아래에 동일합니다 :

    http://www.eggheadcafe.com/conversation.aspx?messageid=29145383&threadid=29145379

  3. ==============================

    3.내가 가입에 하드 코딩 기준이하는 것을 선호합니다. 그것은 SQL 훨씬 더 읽기 및 휴대용한다.

    내가 가입에 하드 코딩 기준이하는 것을 선호합니다. 그것은 SQL 훨씬 더 읽기 및 휴대용한다.

    가독성 : 당신은 당신이 모든 테이블 기준이 바로 거기 가입에 기록되어 있기 때문에받을거야 정확히 어떤 데이터를 볼 수 있습니다. 큰 문에서, 기준은 50 개 다른 표현 묻혀 될 수 있으며 쉽게 놓칠된다.

    이식성 : 당신은 FROM 절의 덩어리를 복사하고 다른 곳에 붙여 넣을 수 있습니다. 즉, 조인 제공하고있는 기준은 당신이 그것으로 이동해야합니다. 에 넣어 다음, 두 테이블을 조인 할 때 항상 기준을 사용하는 경우 가장 논리적 인 조인.

    예를 들면 :

    FROM
    table1 t1
    JOIN table2 t2_ABC ON
      t1.c1 = t2_ABC.c1 AND
      t2_ABC.c2 = 'ABC'
    

    당신은 표 2에서 두 번째 열을 얻을 필요가 있다면 당신은 그냥 메모장에 그 블록을 복사, "ABC"와 교체 / 검색 프레스토와 다시 붙여 넣기 할 준비가 코드의 전체 새로운 블록.

    추가 : 그것은 WHERE 절에 주위에 떠있을 수있는 기준에 대해 걱정할 필요없이 내부와 외부 사이의 변화도 쉽게 조인입니다.

    나는 가능한 런타임 기준에 대한 엄격 WHERE 절을 보유하고 있습니다.

    효율성에 관해서는 : 당신은 실행 속도를 참조하는 경우, 다음 사람으로 다른 사람, 그것의 중복을 주장했다. 당신은 쉽게 디버깅 및 재사용을 참조하는 경우, 그때는 옵션 1을 선호합니다.

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

    4.한 가지 내가 그 전에 통지 마지막으로하고 싶은 말 .. 두 가지 방법이 절은 좀 더 빨리 좀 답변에서 발견 될 수있는 경우의 기준을 사용하여 동일한 성능을 제공 할 수 있습니다 ..

    한 가지 내가 그 전에 통지 마지막으로하고 싶은 말 .. 두 가지 방법이 절은 좀 더 빨리 좀 답변에서 발견 될 수있는 경우의 기준을 사용하여 동일한 성능을 제공 할 수 있습니다 ..

    그러나 나는 당신이 당신의 논리적 인 요구에 사용할 수 있습니다, 하나 개의 차이를 확인 ..

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

    5.난 당신이 모든 경우에 적용이 하나의 유한 한 답을 찾을 수 있다고 생각하지 않습니다. 2는 항상 서로 호환되지 않습니다 - 일부 쿼리 (일부 왼쪽 조인) 당신이 줄에서 어디를 대에서 기준을 배치하여 서로 다른 결과를 가지고 올 것이기 때문이다.

    난 당신이 모든 경우에 적용이 하나의 유한 한 답을 찾을 수 있다고 생각하지 않습니다. 2는 항상 서로 호환되지 않습니다 - 일부 쿼리 (일부 왼쪽 조인) 당신이 줄에서 어디를 대에서 기준을 배치하여 서로 다른 결과를 가지고 올 것이기 때문이다.

    귀하의 경우에는, 당신은 이러한 쿼리를 모두 평가해야합니다. 더 최적 인 결정에 좋은 첫 단계가 될 것입니다 - SSMS에서는 이러한 쿼리 모두의 예상과 실제 실행 계획을 볼 수 있습니다. 또한 각각의 시간 및 IO 볼 수 있습니다 (설정 통계 시간을 설정 통계에 io를) - 그것은 또한 당신에게 당신의 결정을 내릴 수있는 정보를 제공 할 것입니다.

    귀하의 질문에 쿼리의 경우 - 나는 그들이 모두 같은 쿼리 계획으로 나올 것이다 내기 것 - 그래서 그것은 문제가되지 않을 수 있습니다,이 경우에는, 그러나 다른 사람에서 다른 계획을 잠재적으로 생성 할 수있다.

    2 사이의 차이를 보려면이 시도 ...

    SET STATISTICS IO ON
    SET STATISTICS TIME ON
    
    select salesman.salesmanid, 
           max(sales.quantity)
    from   salesmaninner join sales on salesman.salesmanid =sales.salesmanid
           and sales.salesdate < salesman.promotiondate
    group by salesman.salesmanid
    
    select salesman.salesmanid, 
           max(sales.quantity)
    from   salesmaninner join sales on salesman.salesmanid = sales.salesmanid 
    where  sales.salesdate < salesman.promotiondate
    group by salesman.salesmanid
    
    SET STATISTICS TIME OFF
    SET STATISTICS IO OFF
    
  6. ==============================

    6.그것은 경박를 보일지도 모르지만, 대답은있는 쿼리 분석기는 가장 효율적인 계획을 생성하는 중 쿼리입니다.

    그것은 경박를 보일지도 모르지만, 대답은있는 쿼리 분석기는 가장 효율적인 계획을 생성하는 중 쿼리입니다.

    내 마음에, 그들은 쿼리 분석기가 아니라 동일한 계획을 생성 할 수 있지만, 테스트해야 할 것, 그래서 해당하는 것으로 보인다.

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

    7.어느 쪽도 아니 WHERE 방법이 너무 (http://msdn.microsoft.com/en-us/library/ms190014.aspx)을 수행하는 기존의 방법을 고려하여,보다 효율적입니다. 당신은 실행 계획을보고 그들이 같은 일을 볼 수 있습니다.

    어느 쪽도 아니 WHERE 방법이 너무 (http://msdn.microsoft.com/en-us/library/ms190014.aspx)을 수행하는 기존의 방법을 고려하여,보다 효율적입니다. 당신은 실행 계획을보고 그들이 같은 일을 볼 수 있습니다.

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

    8.SQL Management Studio에서 예상 실행 계획에 익숙해집니다! 다른 사람이 말한 것처럼, 당신은 상관없이 당신이 그렇게 그 추정치를 신뢰 할 것을 분석기의 자비에있어 없습니다. 난 당신이 동일한 계획을 생성 할 것이다 제공하는 두 가지 생각합니다.

    SQL Management Studio에서 예상 실행 계획에 익숙해집니다! 다른 사람이 말한 것처럼, 당신은 상관없이 당신이 그렇게 그 추정치를 신뢰 할 것을 분석기의 자비에있어 없습니다. 난 당신이 동일한 계획을 생성 할 것이다 제공하는 두 가지 생각합니다.

    이 개발 문화를 변경하는 시도가 있다면, 당신에게 더 나은 계획을주는 하나를 선택; 동일한 사람을 위해, 문화에 따라

    병목 현상이있는 곳이 당신과 당신의 팀에 다음 높은 다섯 인 경우 -이 같은 다른 "효율성"게시물 (가 성실하고 비꼬는 모두의)에 댓글을 달았습니다.

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

    9.사례 1 (기준 조인의)이 더 나은 캡슐화하고, 증가 된 캡슐은 일반적으로 좋은 일이다 : 나중에 "LEFT로 변환 가입, 함께 적은 가독성 (관련 물건을 증가하는 경우 / 다른 쿼리에 누락 복사 붙여 넣기 감소, 버그 감소 WHERE 절에 소음 "). 이 경우, WHERE 절은 주요 테이블 기준 또는 기준 스팬 여러 테이블 있음을 캡처합니다.

    사례 1 (기준 조인의)이 더 나은 캡슐화하고, 증가 된 캡슐은 일반적으로 좋은 일이다 : 나중에 "LEFT로 변환 가입, 함께 적은 가독성 (관련 물건을 증가하는 경우 / 다른 쿼리에 누락 복사 붙여 넣기 감소, 버그 감소 WHERE 절에 소음 "). 이 경우, WHERE 절은 주요 테이블 기준 또는 기준 스팬 여러 테이블 있음을 캡처합니다.

  10. from https://stackoverflow.com/questions/1401889/sql-filter-criteria-in-join-criteria-or-where-clause-which-is-more-efficient by cc-by-sa and MIT license