실행 계획 기본 사항-해시 일치 혼동


39

실행 계획을 배우기 시작했으며 해시 일치가 정확히 어떻게 작동하고 간단한 조인에 사용되는지에 대해 혼란스러워합니다.

select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)

여기에 이미지 설명을 입력하십시오

내가 이해 한 것처럼 최상위 인덱스 스캔의 결과는 해시 가능이되고 맨 아래 인덱스 클러스터 스캔의 각 행이 조회됩니다. 해시 테이블이 적어도 어느 정도 작동하는 방식을 이해하지만이 예제에서 어떤 값이 정확하게 해시되는지 혼동됩니다.

내가 이해하는 것은 그들 사이의 공통 필드 인 id가 해시됩니다. 그러나 이것이 사실이라면 왜 숫자를 해시합니까?

답변:


29

SQLRockstar의 답변 인용문

크고 분류되지 않은 입력에 가장 적합합니다.

지금,

  • Users.DisplayName 인덱스 스캔 (비 클러스터 가정)에서 Users.Id (클러스터 가정) = 정렬되지 않음을 얻습니다.
  • 또한 OwnerUserId = 분류되지 않은 게시물을 스캔하고 있습니다.

이것은 2 개의 비 순차 입력입니다.

Title을 포함하여 OwnerUserId의 게시물 테이블에서 색인을 고려합니다. 이것은 입력의 한쪽에 JOIN에 약간의 순서를 추가하고 인덱스를 덮습니다.

CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)

그런 다음 Users.DisplayName 인덱스가 사용되지 않고 대신 PK를 검색합니다.


1
아 알았어, 이제 알았어, 나는 Users.DisplayName이 PK에 의해 주문되고 있다고 생각했다. 이제 해시를 사용하면 나에게 훨씬 더 의미가 있습니다. 감사!
Kyle Brandt

1
OPTION (FAST n)힌트 는 시도 할 수 있습니다 . 여기서 n은 예상되는 대략적인 행 수입니다. 이것이 할 일은 n이 낮을 때 해시 조인 대신 중첩 루프를 향해 최적화 프로그램을 바이어스하는 것입니다. 그 이유는 해시 조인이 큰 조인의 경우 빠르지 만 시작 비용이 높기 때문입니다. 중첩 루프는 행당 비용이 많이 들지만 매우 저렴하게 시작할 수 있습니다. 따라서 실제 데이터 및 액세스 패턴을 기반으로 미세 조정해야합니다.
Gaius

1
@Gaius : 개인적으로 힌트보다는 색인을 원합니다. 힌트는 쿼리를 추가 할 때만 유용합니다. 일명 힌트는 시간이지나면서 책임이됩니다. 색인은 훨씬 더 유용한 경향이 있습니다.
gbn

1
:-)
Gaius

14

에서 http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/

"해시 조인은 조인을 수행하기 위해 해시 테이블을 생성해야하므로 비용이 많이 드는 조인 작업 중 하나입니다. 즉, 대규모의 정렬되지 않은 입력에 가장 적합한 조인입니다. 조인

해시 조인은 먼저 입력 중 하나를 읽고 조인 열을 해시하고 결과 해시와 열 값을 메모리에 구축 된 해시 테이블에 넣습니다. 그런 다음 두 번째 입력의 모든 행을 읽고 해시 한 다음 결과 해시 버킷의 행에서 조인 행을 확인합니다. "

이 게시물에 링크 :

http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx

HTH


그래서 그것이 단지 id 필드라면, id 필드를 해싱하는 이점을 이해하지 못하는 것 같습니까?
Kyle Brandt

Craig Freedman의 블로그 링크에 +1하면 더 많은 기사를 볼 수 있습니다 : blogs.msdn.com/b/craigfr/archive/tags/joins
Jeff

9

숫자 필드 해시의 장점은 더 큰 값을 가져 와서 작은 조각으로 나누어 해시 테이블에 맞출 수 있다는 것입니다.

Grant Fritchey가이를 설명하는 방법은 다음과 같습니다.

"해시 테이블은 반면에 모든 요소를 ​​동일한 크기의 범주 또는 버킷으로 나누어 요소에 빠르게 액세스 할 수 있도록하는 데이터 구조입니다. 해싱 함수는 요소가 들어가는 버킷을 결정합니다. 예를 들어 테이블에서 행을 가져 와서 해시 값으로 해시 한 다음 해시 값을 해시 테이블에 저장할 수 있습니다. "

다음 기사의 링크에서 eBook "Dispenting SQL Server 실행 계획"의 무료 사본을 얻을 수도 있습니다.

출처 : http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/


JOINS에 관한 또 다른 흥미로운 기사 시리즈 : sql-server-performance.com/articles/dba/…
Jeff

SQL Server 실행 계획 해부를 통해 노력하고 있습니다. 훌륭합니다! 그러나 나는이 시점에 조금 붙어있어 : -P
Kyle Brandt

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.