2

우리는 100,000 개가 넘는 레코드가있는 테이블을 가지고 있습니다.이 테이블은 천천히 변화하는 차원으로 동일한 내구성 키 , ValidFrom (화면 캡처에서 TaskDate로 표시) 및 ValidUntil 필드는 특정 날짜의 레코드 유효성을 결정합니다.SQL Server 스레드 - 하나는 모든 작업을 수행하고 다른 MAXDOP - 1 (5..30)은 아무 작업도하지 않음

필터 된 인덱스, 필터링 된 통계, 하드 코드 된 매개 변수, 동적 SQL을 사용하여 문제를 해결하려고 시도한 후 특정 문제에 대한 진전 없음 : 옵티마이 저는 올바른 인덱스를 선택하고 검색을 수행하며 예상 레코드가 상대적으로 가깝습니다. 실제 레코드가 있지만 하나의 CPU 스레드 만이 내용을 읽습니다.

Tricky Read - Skewed Workload

내가 MAXDOP 6를 실행하거나 사용 가능한 모든 CPU에서 실행시키는 경우 문제가되지 않습니다.

그 밖의 어떤 시도를 할 수 있습니까?

먼저 편집 :이 여기에 문제가되지 않습니다 동안

일부 댓글이 포함 된 데이터 크기에 집중되었다. 첨부 된 것은 레코드 카운트 이상을 수행하는 고급 쿼리입니다 (처음에는 게으른 작업자 스레드 상황을 보여주기 위해 사용됨).

읽기 작업시이 지연 작업자 스레드의 직접적인 결과는 정확히 동일한 키 조회입니다. 단 하나의 스레드 만 레코드를 수신 중이며 수행 할 작업이 있습니다.

실행 계획은 여기에서 볼 수있다 : http://pastebin.com/zJwZ56vh

30 lazy threads while one is working

+0

쿼리가 무엇 참조에 대한

계획의 병렬 부분의 스크린 샷? 그 계획 이요? 나는 당신이 이것을 익명화하려고 시도했다는 것을 알았습니다. 아마도 SQL Sentry Plan Explorer를 사용하여 계획과 질문을 포럼에 실제로 업로드하는 것을 고려해보십시오. (익명 계획에 기능이 내장되어 있음) –

+0

22MB의 데이터입니다. 왜 지구상에서 병렬화할까요? 6 개의 스레드가 너무 많습니다. –

+0

@RemusRusanu - '73.4 MB'는 예상 행간 차이와 실제 행 불일치로 인해'* 3.3 '크기가 증가하지만 여전히 10K 페이지 미만입니다. –

답변

2

이 여기에 설명되어 있습니다. Parallel Nested Loops Join.

중첩 루프 조인에 한 행만 공급할 수 있습니다. 중첩 루프 조인을 사용하는 병렬 처리는 일반적으로 여러 스레드가 개별 외부 행을 처리하도록하는 것이 아니라 여러 스레드간에 외부 행을 분산하여 작동합니다.

이 단일 스레드가 할당 도착 수단이 병렬 영역의 모든 작업을 수행 끝 처리 될 하나의 외부 로우가 같이 (이 때까지 재분할 스트림 연산자)

예외

단일 행 및 외측 간혹 상관없이 파라미터 수 중첩 루프 내측 수율 병렬 가입

(Source P. 21) 귀하의 경우는 가입 교차되지 않고 Table3의 값에

는 상관 관계와 그 예외가 적용되지 않도록 중첩 루프 연산자에 대해 "외부 참조"에 표시됩니다.

따라서 병렬 처리 할 부분을 더 이상 중첩 루프 안쪽으로 이동해야합니다. Table3에서 항상 하나의 행이있을 경우 별개의 쿼리에서 스칼라 변수에 값을 할당 한 다음 기본 쿼리에서 스칼라 변수를 사용할 수 있습니다.

그렇지 않으면 다른 방법으로 쿼리를 표현하거나 쿼리 힌트를 사용하여이를 확인할 수 있습니다.

Plan

+0

감사합니다 마틴, 정말 좋은 설명입니다! 나는 "RunTimeCountersPerThread Thread ="3 "ActualRows ="0 ""에 대해 빙빙을 찍고 있었고 대답을 쓰고있을 때 매우 결론에 도달했습니다 : http://ellynguyen.wordpress.com/2011/08/ 25/query-tuning-for-data-warehouse /를 참조하십시오. 어떤 내부적 인 이유 때문에 스칼라 변수를 사용할 수 없기 때문에 row_id % 8에 기반한 큰 데이터 세트를 파티셔닝하고 정확히 8 개의 레코드를 루프에 공급하고 있습니다 - 마술처럼 작동합니다! – milivojeviCH

+0

@mceda 나는 네가 더 이상 중첩 된 루프의 내부에서 작동하지 않는다고 생각한다. –

관련 문제