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 개의 테이블 조인 모두에 추가하면 여전히 교착 상태가 발생합니다.
- 쿼리 자체 교착 상태 다른 활성 프로세스가 없으면 교착 상태가됩니다.
- 병렬 처리가없는 쿼리 계획은 교착 상태가 아닙니다
우리의 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 :) (하이퍼 바이저)
이 쿼리에서 교착 상태를 방지하려면 어떻게합니까?