재고 보고서를 생성하는 프로세스가 있습니다. 클라이언트 쪽에서 프로세스는 구성 가능한 수의 작업자 스레드로 분할되어 여러 저장소 (잠재적으로 수천 개, 일반적으로 수십 개) 중 하나에 해당하는 보고서에 대한 데이터 청크를 작성합니다. 각 작업자 스레드는 저장 프로 시저를 실행하는 웹 서비스를 호출합니다.
각 청크를 처리하기위한 데이터베이스 프로세스는 #Temporary 테이블에 많은 데이터를 수집합니다. 각 처리 청크의 끝에서 데이터는 tempdb의 영구 테이블에 기록됩니다. 마지막으로 프로세스가 끝날 때 클라이언트 측의 하나의 스레드가 영구 tempdb 테이블의 모든 데이터를 요청합니다.
이 보고서를 실행하는 사용자가 많을수록 속도가 느려집니다. 데이터베이스의 활동을 분석했습니다. 한 시점에서 프로세스의 한 지점에서 35 개의 개별 요청이 모두 차단되는 것을 보았습니다. 이러한 SPID는 모두 LATCH_EX
리소스에서 50ms 대기 유형 입니다 METADATA_SEQUENCE_GENERATOR (00000010E13CA1A8)
. 한 SPID에이 리소스가 있으며 다른 SPID는 모두 차단하고 있습니다. 웹 검색 에서이 대기 리소스에 대한 내용을 찾지 못했습니다.
우리가 사용하는 tempdb의 테이블에는 IDENTITY(1,1)
열이 있습니다. 이 SPID가 IDENTITY 열을 기다리고 있습니까? 차단을 줄이거 나 없애기 위해 어떤 방법을 사용할 수 있습니까?
서버는 클러스터의 일부입니다. 서버가 64 비트 Windows 2008 R2 Enterprise에서 64 비트 SQL Server 2012 Standard Edition SP1을 실행하고 있습니다. 서버에는 64GB RAM과 48 개의 프로세서가 있지만 표준 버전이므로 데이터베이스는 16 개만 사용할 수 있습니다.
(이 모든 데이터를 보유하기 위해 tempdb에 영구 테이블을 사용하는 디자인에 감격하지는 않습니다.이 기술을 변경하는 것은 흥미로운 기술적, 정치적 도전이 될 수 있지만 제안 사항은 열려 있습니다.)
2013 년 4 월 23 일 업데이트
Microsoft와 함께 지원 사례를 개설했습니다. 자세한 내용은이 질문을 계속 업데이트하겠습니다.
2013 년 5 월 10 일 업데이트
SQL Server 지원 엔지니어는 대기가 IDENTITY 열에 의해 발생한다는 데 동의했습니다. IDENTITY를 제거하면 대기 시간이 제거되었습니다. SQL 2008 R2에서이 문제를 복제 할 수 없었습니다. SQL 2012에서만 발생했습니다.