2010-03-15 4 views
3

가입SQL Server 2008은 내가이 쿼리를 최적화하기 위해 노력하고, 최근 힌트

UPDATE Analytics 
SET UserID = x.UserID 
FROM Analytics z 
INNER JOIN UserDetail x ON x.UserGUID = z.UserGUID 

예상 실행 계획 해시 일치 (집계)에 표 업데이트에 57 %와 40 %를 보여줍니다. 나는 주변에서 기웃 거리며 약간의 힌트를 얻었습니다. 그래서 내 안쪽 조인과 WA-ZHAM에 LOOP 힌트를 추가했습니다! 새 실행 계획은 Table Update에서 38 %, Index Seek에서 58 %를 보여줍니다.

그래서 신중함이 나에게 좋을 때까지 모든 검색어에 루프 힌트를 적용하려고했습니다. 인터넷 검색을 한 후, JOIN 힌트가 BOL에 포함되어 있지 않음을 알게되었습니다. 따라서 ...

  1. 누군가 내 질문에 LOOP 힌트를 적용하는 것이 좋지 않은 이유를 말해 줄 수 있습니까? LOOP JOIN은 쿼리 최적화 프로그램의 기본 JOIN 메서드이지만 명령문의 유효성을 확인할 수 없다는 어딘가에 읽었습니까?
  2. JOIN 힌트는 언제 사용됩니까? sh * t가 팬을 때리고 유령의 버스터가 마을에 없을 때?
  3. LOOP, HASH 및 MERGE 힌트의 차이점은 무엇입니까? BOL은 MERGE가 가장 느린 것 같지만 각 힌트의 적용은 무엇입니까?

시간 내 주셔서 감사합니다.

SQL Server 2008 BTW를 실행하고 있습니다. 위에 언급 된 통계는 예상 실행 계획입니다.

+0

이 문제를 조사하기 전에 색인 및 통계가 최신 상태입니까? – Paddy

+0

예 그들은 최신입니다 – super9

답변

10

누군가 내 검색어에 LOOP 힌트를 적용하는 것이 좋지 않은 이유를 말해 줄 수 있습니까? LOOP JOIN은 쿼리 최적화 프로그램의 기본 JOIN 메서드이지만 명령문의 유효성을 확인할 수 없다는 어딘가에 읽었습니까?

이렇게하면 옵티마이 저가 더 효율적인 다른 방법을 고려할 수 있습니다.

JOIN 힌트는 언제 사용됩니까? sh * t가 팬을 때리고 유령의 버스터가 마을에 없을 때?

(옵티마이 저가 결정을 내리는) 데이터 분포가 심하게 비뚤어지고 통계가이를 올바르게 나타낼 수없는 경우.

LOOP, HASH 및 MERGE 힌트의 차이점은 무엇입니까? BOL은 MERGE가 가장 느린 것 같지만 각 힌트의 적용은 무엇입니까?

이들은 서로 다른 알고리즘입니다.

  1. LOOP 중첩 루프이다 외부 테이블의 각 레코드에 대해, 내부 테이블 (가능한 인덱스를 사용하여) 일치 검색된다. 두 테이블의 레코드 중 극히 일부만 JOINWHERE 조건을 만족하면 가장 빠릅니다.

  2. MERGE 정렬 두 테이블 모두 일치하지 않는 레코드를 건너 뛰고 정렬 순서로 트래버스합니다.FULL JOIN들에 대한 가장 빠른 및 테이블 중 하나에서 임시 저장 (메모리 또는 tempdb)에

  3. HASH 빌드 해시 테이블을 모두 레코드가 이미 (이전 정렬 작업 또는 인덱스 액세스 경로를 사용하는 경우) 분류하는 경우 다른 레코드에서 각 레코드를 검색합니다. 두 테이블 중 큰 부분이 WHEREJOIN 조건과 일치하면 가장 빠릅니다. 표 업데이트에

+0

위대한 설명! 마틴의 대답에 당신이 2 센트를 줄 수 있다고 생각하지 않아? – super9

2

예상 실행 계획 쇼 57 % 과 해시 일치 (집계)에 40 %. 나는 약간 주위에 를 기웃 거리며 갔고, JOIN 암시의 화제를 가로 질러왔다. 그래서 내 내부 조인과 WA-ZHAM에 루프 힌트를 추가했습니다! 새로운 실행 계획은 테이블 업데이트에서 38 %를 나타내고 인덱스 검색에서 58 %를 보여줍니다.

확실히 제안 된 계획이 더 나 빠졌다는 뜻입니까? 테이블 갱신이 일정한 시간이 걸린다 고 가정하면 이제 인덱스 활동에 의해 비용이 초과됩니다.

+0

이것은 공정한 가정입니까? 나는 인덱스 시크 (Index Seek) 작업의 대부분을 수행하는 것이 항상 인상적이었습니다. – super9

+0

내가 틀렸다면 고칠 수 있지만 나는 공정한 가정이라고 생각한다. Analytics.UserGUID에 클러스터 된 색인이 있습니까? 그렇다면 GUID를 다른 값으로 업데이트하면 상당한 IO가 발생하여 성능 문제를 설명 할 수 있습니다. –

+0

Analytics.UserGUID에 클러스터되지 않은 색인이 있습니다. UserGUID가 아닌 UserID 열을 업데이트하고 있습니다. Analytics.UserID 열에 인덱스가 없습니다. – super9

관련 문제