문제

두 개의 테이블에 합류하는 비교적 간단한 쿼리가 있습니다. "여기서"기준은 조인 기준 또는 Where 절로 표현 될 수 있습니다. 어느 쪽이 더 효율적인지 궁금합니다.

Query는 처음부터 홍보 될 때까지 영업 사원의 최대 판매를 찾는 것입니다.

사례 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는 SQL Server 2005입니다

편집하다조인 기준의 두 번째 부분이 또는 Where 절이 Sales.SalesDate <일부 고정 날짜 인 경우 실제로 두 테이블에 가입하는 기준이 아니라고 답변을 변경합니다.

도움이 되었습니까?

해결책

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

나는 항상 케이스 #2를 사용 하겠는데 - 왜? 제 생각에는 두 테이블 사이의 조인을 조인 절에 설정하는 실제 기준 만 넣어야합니다. 다른 모든 것은 WHERE 절에 속합니다.

물건을 깨끗하게 유지하고 그들이 속한 곳에 물건을 넣는 문제입니다.

분명히, 기준의 배치가 결과가 반환되는 결과에 차이가있는 경우 왼쪽 외부 조인이있는 경우가 있습니다. 물론 그 경우는 내 권장 사항에서 제외됩니다.

마크

다른 팁

실행 계획 추정기 및 SQL 프로파일 러를 실행하여 서로 어떻게 쌓이는 지 확인할 수 있습니다.

그러나이 SQL Server MVP에 따라 시맨 적으로 후드 아래에서 동일합니다.

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

나는 조인에 하드 코딩 된 기준을 선호합니다. SQL을 훨씬 더 읽기 쉽고 휴대용으로 만듭니다.

가독성 : 모든 테이블 기준이 Join에서 바로 작성되기 때문에 어떤 데이터를 얻을 것인지 정확하게 볼 수 있습니다. 대규모 진술에서, 기준은 50 개의 다른 표현 내에 묻힐 수 있으며 쉽게 놓칠 수 있습니다.

이식성 : FROM 절에서 청크를 복사하여 다른 곳에 붙여 넣을 수 있습니다. 그것은 결합과 함께 가야 할 모든 기준을 제공합니다. 이 두 테이블에 합류 할 때 항상 해당 기준을 사용하는 경우 조인에 넣는 것이 가장 논리적입니다.

예를 들어:

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

표 2에서 두 번째 열을 가져와야하는 경우 해당 블록을 메모장, 검색/repalce "ABC"및 Presto 및 전체 새 코드 블록으로 복사하면 다시 붙여 넣을 준비가되었습니다.

추가 : WHERE 절에 떠 다니는 기준에 대해 걱정할 필요없이 내부와 외부 조인 사이에서 변경하는 것이 더 쉽습니다.

가능한 경우 런타임 기준에 대해 Where 절을 엄격하게 예약합니다.

효율성에 관해서는 : 당신이 발굴 속도를 언급한다면, 다른 사람들이 언급했듯이, 그것은 중복됩니다. 더 쉬운 디버깅 및 재사용을 언급한다면 옵션 1을 선호합니다.

내가 알 수 있듯이 마침내 말하고 싶은 한 가지는 그 전에 두 가지 방법 모두 동일한 성능을 제공하거나 기준을 사용할 수 있습니다. 어디에 일부 답변에서 찾은 것처럼 조항이 조금 더 빠를 수 있습니다 ..

하지만 한 가지 차이점을 확인했습니다. 논리적 요구에 사용할 수 있습니다.

  1. 기준을 사용합니다 켜짐 조항은 조건에 따라 조인 열이 널이됩니다.

  2. 기준을 사용합니다 어디에 조항 전체 결과에서 행을 필터링/건너 뛰기

나는 모든 경우에 적용되는이 답변에 대한 유한 한 답을 찾을 것이라고 생각하지 않습니다. 2는 항상 상호 교환 할 수있는 것은 아닙니다. 일부 쿼리 (일부 왼쪽 조인)의 경우 여기서 where vs the line에 기준을 배치하여 다른 결과를 얻게됩니다.

귀하의 경우,이 두 쿼리를 모두 평가해야합니다. 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

Flippant처럼 보일 수 있지만 답은 쿼리 분석기가 가장 효율적인 계획을 생성하는 쿼리입니다.

내 생각에, 그것들은 동등한 것처럼 보이므로 쿼리 분석기는 동일한 계획을 생성 할 수 있지만 테스트해야합니다.

여기서 방법을 사용하여 오래된 방법으로 간주되는 경우도 더 효율적입니다.http://msdn.microsoft.com/en-us/library/ms190014.aspx). 실행 계획을보고 그들이 같은 일을하는 것을 볼 수 있습니다.

SQL Management Studio의 예상 실행 계획에 익숙해집니다 !! 다른 사람들이 말했듯이, 당신은 그 추정치를 신뢰하더라도 분석기의 자비에 있습니다. 나는 당신이 제공 한 두 사람이 똑같은 계획을 만들어 낼 것이라고 생각합니다.

개발 문화를 바꾸려는 시도라면 더 나은 계획을 제공하는 문화를 선택하십시오. 동일 한 사람들은 문화를 따르십시오.

나는 이것과 같은 다른 "효율성"게시물에 대해 이것을 댓글을 달았습니다 (성실하고 냉소적입니다)-이것이 병목 현상이있는 곳이라면, 당신과 당신의 팀에게 하이 파이브입니다.

사례 1 (조인 기준)은 캡슐화에 더 좋으며 캡슐화 증가는 일반적으로 좋은 것입니다. 나중에 다른 쿼리로 복사/붙여 넣기 생략, 나중에 왼쪽 조인으로 변환되면 버그 감소 및 가독성이 높아지는 경우 (관련된 것과 적은 것과 적은 것” 소음 "위치 조항). 이 경우 WHER 절은 여러 테이블에 걸쳐있는 주요 표 기준 또는 기준 만 캡처합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top