해시 조인을 지정할 때의 장점 단지 조인을 수행하는 것만으로도 가입 하시겠습니까?

StackOverflow https://stackoverflow.com/questions/800124

문제

정기적 인 조인 (SQL Server가 최상의 조인 전략을 결정하는 곳)을 통해 해시 조인을 명시 적으로 수행하는 장점은 무엇입니까? 예 :

select pd.*
from profiledata pd
inner hash join profiledatavalue val on val.profiledataid=pd.id

위의 단순한 샘플 코드에서는 조인 전략을 지정하는 반면, "해시"키워드 SQL Server를 떠나는 경우 ( "실제 실행 계획에 따라) 장면에 합병을합니다.

도움이 되었습니까?

해결책

Optmiser는 일상적인 사용을 위해 충분한 일을합니다. 그러나 이론적으로 극단적으로 완벽한 계획을 찾는 데 3 주가 필요할 수 있으므로 생성 된 계획이 이상적이지 않을 가능성이 있습니다.

매우 복잡한 쿼리 나 대량의 데이터가 단순히 좋은 계획을 생성 할 수없는 많은 양의 데이터가 없다면 내버려 둘 것입니다. 그런 다음 나는 그것을 고려할 것이다.

그러나 시간이 지남에 따라 데이터가 변경/성장하거나 색인이 변경됨에 따라 Join Hint는 쓸모 없게되어 최적의 계획을 방지합니다. Join Hint는 개발 당시 해당 데이터 세트를 사용하여 단일 쿼리에 대해서만 최적화 할 수 있습니다.

개인적으로, 나는 모든 프로덕션 코드에서 조인 힌트를 지정한 적이 없습니다.

일반적으로 쿼리를 변경하거나 색인을 추가/변경하거나 분해하여 나쁜 결합을 해결했습니다 (예 : 임시 테이블을 먼저로드). 또는 내 쿼리가 잘못되었거나 암시 적 데이터 유형 변환이 있거나 스키마 등의 결함이 강조되었습니다.

나는 다른 개발자들이 그것들을 사용하는 것을 보았지만 복잡한 견해에 중첩 된 복잡한 견해를 가진 곳에서만 리팩토링 될 때 나중에 문제를 일으켰습니다.

편집하다:

나는 오늘날 일부 동료들이 그들을 사용하여 나쁜 쿼리 계획 (Nolock 및 Maxdop 1)을 강요하기 위해 그들을 사용하여 하류 시스템 중 하나가 직접 호출하는 레거시 복합 중첩 뷰에서 마이그레이션을 "장려"할 수있는 전환을 가졌습니다.

다른 팁

해시 힌트를 시도 할 때 : 어떻습니까?

  • 테이블 중 하나 이상에 적절한 지수가 있는지 확인한 후.
  • 쿼리를 다시 정리하려고 시도한 후 조인을 "in"또는 "ensists"로 변환하고, 조인 순서를 변경 (실제로 힌트 일뿐), 조건 조정 조건 등의 위치에서 논리를 이동하는 것 등.

해시 조인이 효과적인시기에 대한 몇 가지 기본 규칙은 조인 조건이 테이블 인덱스로 존재하지 않고 테이블 크기가 다른시기입니다. 기술적 인 설명을 찾고 있다면 해시가 작동하는 방법에 대한 좋은 설명이 있습니다.

결합 힌트를 사용하는 이유 (힘 순서의 부작용으로 해시/병합/루프)?

  • 코너 케이스의 매우 느린 실행 (.5-> 10.0s)을 피하기 위해.
  • Optimizer가 평범한 계획을 지속적으로 선택할 때.

제공된 힌트는 일부 상황에서는 비 이상적이지만보다 일관되게 예측 가능한 런타임을 제공합니다. 예상되는 최악의 경우 및 최상의 시나리오는 힌트를 사용할 때 사전 테스트해야합니다. 예측 가능한 런타임은 예를 들어 [.25, 10.0s] 범위보다 엄격하게 최적화 된 공칭 [.3s, .6s] 쿼리가 선호되는 웹 서비스에 중요합니다. 통계가 신선하게 업데이트되고 모범 사례가 뒤 따르는 대규모 런타임 차이가 발생할 수 있습니다.

개발 환경에서 테스트 할 때는 핫/콜드 런타임 분산을 피하기 위해 "속임수"를 끄야합니다. 다른 사람으로부터 게시하다...

CHECKPOINT -- flushes dirty pages to disk
DBCC DROPCLEANBUFFERS -- clears data cache
DBCC FREEPROCCACHE -- clears execution plan cache

마지막 옵션은 옵션 (Recompile) 힌트와 동일 할 수 있습니다.

기계의 MaxDop 및 Loading은 런타임에 큰 차이를 만들 수 있습니다. CTE를 임시 테이블로 구체화하는 것은 또한 좋은 잠금 장치와 고려해야 할 것입니다.

해시는 다른 조인보다 병렬화되고 확장되며 데이터웨어 하우스의 처리량을 최대화하는 데 능숙합니다.

배송 코드에서 본 유일한 힌트는 옵션 (힘 순서)이었습니다. SQL 쿼리 최적화의 바보 같은 버그는 필터링되지 않은 Varchar와 고유 식별자에 가입하려는 계획을 생성합니다. 힘 순서를 추가하면 필터를 먼저 실행했습니다.

나는 과부하 열이 나쁘다는 것을 알고 있습니다. 때때로, 당신은 그것과 함께 살아야합니다.

논리 계획 최적화기는 최적의 솔루션을 찾는 것을 보장하지 않습니다. 정확한 알고리즘은 프로덕션 서버에서 사용하기에는 너무 느립니다. 대신 욕심 많은 알고리즘이 사용됩니다.

따라서 이러한 명령의 이론적 근거는 사용자가 최적의 조인 전략을 지정하도록하는 것입니다.

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