KB2926217 - FIX: 데이터베이스 잠금 활동이 SQL Server에서 증가하면 성능 문제가 발생함

적용 대상
SQL Server 2012 Enterprise SQL Server 2012 Developer SQL Server 2012 Standard SQL Server 2012 Express SQL Server 2012 Web SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2008 Service Pack 3 SQL Server 2008 Developer SQL Server 2008 Enterprise SQL Server 2008 Standard SQL Server 2008 R2 Service Pack 2 SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard

기본적으로 SQL Server 2014용 서비스 팩 1 및 SQL Server 2012용 서비스 팩 3에는 이 픽스가 포함되어 있으며 픽스를 사용하도록 설정하기 위해 추적 플래그를 추가할 필요가 없습니다. 해결 방법 섹션의 누적 업데이트 중 하나를 설치한 후 픽스를 사용하도록 설정하려면 시작 매개 변수에 추적 플래그 1236을 추가하여 Microsoft SQL Server를 시작해야 합니다.

증상

프로세서가 많은 컴퓨터에서 Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 또는 SQL Server 2008 R2의 instance를 실행한다고 가정합니다. 특정 데이터베이스에 대한 잠금(자원 종류 = DATABASE)이 특정 임계값을 초과하면 다음과 같은 성능 문제가 발생합니다.

  • LOCK_HASH 스핀 잠금 수에 대해 상승된 값이 발생합니다.

    참고: 이 스핀 잠금을 모니터링하는 방법에 대한 자세한 내용은 "추가 정보" 절을 참조하세요.

  • 데이터베이스 잠금이 필요한 쿼리 또는 작업은 완료하는 데 시간이 오래 걸립니다. 예를 들어 다음과 같은 성능 지연이 발생할 수 있습니다.

    • SQL Server 로그인
    • 연결된 서버 쿼리
    • sp_reset_connection
    • 트랜잭션

참고 지정된 데이터베이스에서 잠금 목록(리소스 종류 = DATABASE)을 찾으려면 "추가 정보" 절을 참조하세요. 임계값은 환경에 따라 다릅니다.

해결 방법

누적 업데이트 정보

이 문제는 다음 SQL Server 누적 업데이트에서 처음 해결되었습니다.

SQL Server 2008 R2 SP2용 누적 업데이트 13 /en-us/help/2967540

SQL Server 2008 SP3용 누적 업데이트 17 /en-us/help/2958696

2014년 SQL Server용 누적 업데이트 1 /en-us/help/2931693

SQL Server 2012 SP1용 누적 업데이트 9 /en-us/help/2931078

SQL Server의 누적 업데이트 정보

SQL Server에 대한 각각의 새로운 누적 업데이트에는 이전 누적 업데이트에 포함된 모든 핫픽스와 모든 보안 수정 사항이 포함되어 있습니다. SQL Server에 대한 최신 누적 업데이트를 확인하세요.

      

핫픽스 정보
 지원되는 핫픽스는 Microsoft에서 구할 수 있습니다. 그러나 이 핫픽스는 이 문서에서 설명하는 문제만 수정하도록 제작되었습니다. 이러한특정문제가발생하는시스템에만이핫픽스를적용하십시오.

핫픽스를다운로드할수있는경우기술자료문서의맨위에서 "핫픽스다운로드가능"이표시됩니다. 이 절이 표시되지않으면 Microsoft 기술 서비스 및 지원에 핫픽스를 구하도록 요청하세요.

참고 문제가 추가로 발생하거나 문제 해결이 필요한 경우 별도의 서비스 요청을 해야 할 수도 있습니다. 이 특정 핫픽스로 해결할 수 없는 추가 질문과 문제에 대해서는 지원 비용이 청구됩니다. Microsoft 고객 서비스 및 지원 센터 전화 번호의 전체 목록이나 별도의 서비스 요청을 만들려면 다음 Microsoft 웹 사이트를 방문하십시오.

/contactus/?ws=support 참고 "핫픽스 다운로드 사용 가능" 양식에는 핫픽스에서 사용 가능한 언어가 표시됩니다. 사용자 언어가 표시되지 않는것은 해당 언어의 핫픽스를 사용할 수 없기 때문입니다.

상태

Microsoft에서 이는 "적용 대상" 섹션에 나열된 Microsoft 제품에서의 문제임을 확인했습니다.

추가 정보

응용 프로그램은 SQL Server에 연결할 때 먼저 데이터베이스 컨텍스트를 설정합니다. 기본적으로 연결은 SH 모드에서 DATABASE 잠금을 얻으려고 시도합니다. 연결 수명 동안 연결이 중지되거나 데이터베이스 컨텍스트가 변경되면 SH-DATABASE 잠금이 해제됩니다. 동일한 데이터베이스 컨텍스트를 사용하는 많은 활성 연결이 있는 경우 해당 특정 데이터베이스에 대해 DATABASE 리소스 유형의 많은 잠금을 가질 수 있습니다.

CPU가 16개 이상인 컴퓨터에서는 테이블 개체만 분할된 잠금 체계를 사용합니다. 그러나 데이터베이스 잠금은 분할되지 않습니다. 따라서 데이터베이스 잠금 수가 많을수록 SQL Server가 데이터베이스에 대한 잠금을 가져오는 데 더 오래 걸립니다. 대부분의 애플리케이션에서는 이 디자인으로 인해 발생하는 문제가 발생하지 않습니다. 그러나 숫자가 특정 임계값을 초과하는 즉시 잠금을 얻기 위해 추가 작업과 시간이 필요합니다. 추가 잠금이 발생할 때마다 비용이 마이크로초에 불과하지만 잠금 해시 버킷은 스핀 잠금을 사용하여 보호받기 때문에 총 시간이 빠르게 증가할 수 있습니다. 이로 인해 추가 CPU 주기가 발생하며 추가 작업자가 잠금을 얻을 때까지 기다립니다.

이 핫픽스는 시작 시 추적 플래그 T1236을 사용할 때 데이터베이스 잠금 분할을 도입합니다. DATABASE 잠금을 분할하면 각 로컬 파티션에서 잠금 목록의 깊이를 관리할 수 있게 유지됩니다. 이는 DATABASE 잠금을 획득하는 데 사용되는 액세스 경로를 크게 최적화합니다.

LOCK_HASH 스핀 잠금을 모니터링하려면 다음 쿼리를 사용할 수 있습니다. NOCOUNT 설정
CREATE TABLE #spinlock_stats([CaptureTime] datetime,[name] nvarchar(512),[collisions] bigint,
[spins] bigint,[spins_per_collision] real,[sleep_time] bigint,[backoffs] int)
DECLARE @counter int = 1
WHILE @counter< 100
      BEGIN
            INSERT INTO #spinlock_stats SELECT GETDATE() as "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
            WAITFOR DELAY '00:00:05'
            설정 @counter +=1
      End 키
SELECT * FROM #spinlock_stats ORDER BY [CaptureTime]
드롭 테이블 #spinlock_stats SQL Server에서 스핀 잠금 경합을 진단하고 해결하는 방법에 대한 자세한 내용은 다음 문서로 이동하세요.

SQL Server에서 스핀 잠금 경합 진단 및 해결 참고 이 문서는 SQL Server 2008 R2용으로 작성되었지만 정보는 여전히 SQL Server 2012에 적용할 수 있습니다.

참조 자료

SQL Server 2012의 추적 플래그에 대한 자세한 내용을 확인하려면 다음 TechNet 웹 사이트로 이동하십시오.

SQL Server 2012의 추적 플래그에 대한 정보
데이터베이스당 사용자의 데이터베이스 잠금 수를 찾는 방법에 대한 자세한 내용은 다음 쿼리를 사용하여 이 값을 계산합니다.select Resource_database_id, resource_type, request_mode, request_status,
개수 (*) 'LockCount' from sys.dm_tran_locks
Resource_database_id, resource_type, request_mode, request_status별 그룹화