SELECT에서 분할 된 Columnstore 교착 상태를 방지하는 방법


10

SQL Server 2016에는 3 개의 CCI (Clustered Columnstore Index) 테이블이 있습니다.이 CCI는 모두 테넌트 ID를 기준으로 동일한 분할 구성표에 있습니다. 최근에 일관되지 않게, 나는 단순한 테이블에서 조인에서 이러한 테이블에 대한 교착 상태가 발생했습니다. 교착 상태가 발생하는 쿼리 예 :

SELECT  TOP 33 r.tenantid
FROM    Table_r r
        INNER JOIN Table_cm cm ON r.MyKey=cm.MyKey 
        INNER JOIN Table_pe pe ON r.MyKey=pe.MyKey 
WHERE   r.TenantId = 69
        AND pe.TenantId = 69
        AND cm.TenantId = 69

에러 메시지:

트랜잭션 (프로세스 ID 56)이 다른 프로세스와 함께 대기 가능한 일반 오브젝트 자원에서 교착 상태에 빠졌으며 교착 상태 피해자로 선택되었습니다. 트랜잭션을 다시 실행하십시오.

단서 :

  • 쿼리가 CCI 이외의 다른 인덱스를 사용하는 경우 교착 상태가 아닙니다.
  • 세 개의 tenantid 필터 중 두 개를 제거해도 교착 상태가 발생하지 않습니다.
  • 상위 32 이하를 선택하면 교착 상태가 아닙니다.
  • OPTION (MAXDOP 1)을 추가하면 교착 상태가 아닙니다.
  • 스크램블 된 PROD 복제본, PROD READ-ONLY Secondary 및 PROD 자체에서이를 재현 할 수 있습니다.
  • DEV 또는 INT에서이 동작을 재현 할 수 없습니다.
  • WITH (NOLOCK)을 3 개의 테이블 조인 모두에 추가하면 여전히 교착 상태가 발생합니다.
  • 쿼리 자체 교착 상태 다른 활성 프로세스가 없으면 교착 상태가됩니다.
  • 병렬 처리가없는 쿼리 계획은 교착 상태가 아닙니다

교착 상태 XML

우리의 PROD 버전 :

Microsoft SQL Server 2016 (SP2-CU5) (KB4475776)-13.0.5264.1 (X64) 2019 년 1 월 10 일 18:51:38 저작권 (c) Windows Server 2012 R2 Standard 6.3의 Microsoft Corporation Enterprise Edition (64 비트) (빌드 9600 :) (하이퍼 바이저)

이 쿼리에서 교착 상태를 방지하려면 어떻게합니까?

답변:


8

SQL Server 2016을 사용하고 있으므로 columnstore 인덱스와 관련된 병렬 교착 상태에 대한 공개 버그 수정이 하나 이상 있다고 언급 할 가치가 있습니다.

FIX : SQL Server 2016 및 2017의 클러스터 된 열 저장소 인덱스에서 병렬 쿼리를 실행할 때 교착 상태가 발생합니다.

( 처음에 링크를 제공 한 Denis Rubashkin 에게 감사드립니다 )

이것은 SP1 CU7의 일부로 릴리스되었습니다. 당신이 그 CU에 있지 않다면, 당신은 그 기회를 제공해야합니다. 이 수정은 SP2 (모든 CU)에도 포함됩니다.

일반적으로 쿼리 내 병렬 처리 교착 상태를 수정하는 두 가지 방법은 다음과 같습니다.

  • 병렬 처리를 피하십시오 (조회 MAXDOP등을 사용하여 병렬로 가지 않도록 쿼리를 조정하여 )-이것은 Thomas Costers다른 답변 에서 다룹니다.
  • 최신 서비스 팩 / 누적 업데이트를 SQL Server에 적용

2

인트라 쿼리 병렬 스레드 교착 상태 에서 다음 블로그를 확인 했습니까?

SyncPoint내가 착각하고 있지 않다 경우 리소스는 교환 이벤트의 사용을 나타냅니다.
교착 상태 참가자를 보면 모두 동일한 spid (55) 및 batch (0)에서 왔지만 다른 스레드를 사용하고 있음을 알 수 있습니다. 이는 이들이 모두 동일한 병렬 쿼리의 일부임을 나타내며로 쿼리를 실행할 때마다 교착 상태가 발생하지 않음을 확인합니다 MAXDOP 1. 인트라 쿼리 병렬 스레드 교착 상태의 경우 단일 쿼리의 스레드가 동기화 개체, 귀하의 경우 SyncPoint를 기다리는 서로 교착 상태가됩니다.

마지막으로 이런 종류의 동작을 목격했을 때 쿼리를 추가로 최적화하여 쿼리가 병렬 실행 계획을 사용하지 못하게했습니다. 결과 집합을 32 레코드로 제한하거나 다른 인덱스를 사용하여 동일한 작업을 수행했다고 생각합니다.
다른 옵션은 MAXDOP 1이 옵션을 좋아하지는 않지만 쿼리 에 추가 하는 것입니다.

그러나이 두 가지 옵션을 찾기 전에 먼저 최신 SP / CU를 사용하고 있는지 확인하십시오.

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