tempdb 버전 저장소에 대한 질문 때문에 응답에 문제가있는 몇

오늘 오류가 발생했습니다.

오류 : 3967, 심각도 : 17

내가 말할 수있는 것은 기본적으로 ‘풀 버전 저장소’입니다. 내 상점에서 우리는 전에이 오류가 없었기 때문에 응답에 문제가있는 몇 가지 질문을 제기했습니다.

  • 사전 설정된 최대 크기가있는 경우 (총 tempdb 크기 또는 기타 기준) 동적입니까?

  • 그렇지 않은 경우 동적으로 설정하는 설정이 있습니까?

  • 이를 바탕으로 경고를 설정할 수 있습니까? (예 : 크기 등을 추적하는 데 사용되는 DMV)



답변

심각도 17은 SQL Server에 필요한 리소스가 부족함을 나타냅니다. 일반적으로 데이터베이스 공간이 부족한 경우에 표시됩니다. 이 경우 tempdb를 사용하여 tempdb로 유출해야하는 쿼리에 대해 읽기 커밋 된 스냅 샷 격리 버전 행에 tempdb가 사용되고있는 것처럼 들립니다.

tempdb의 최대 크기가 제한되어 있고 예를 들어 매우 큰 크로스 조인을 수행하는 잘못 작성된 쿼리를 시도하는 경우 이것은 매우 일반적 일 수 있습니다.

이 쿼리를 사용하여 tempdb에서 현재 버전 저장소 버전을 볼 수 있습니다.

SELECT *
FROM sys.dm_os_performance_counters dopc
WHERE dopc.counter_name LIKE 'Version %';

Technet은 https://technet.microsoft.com/en-us/library/cc966545.aspx#EDAA 에서 버전 저장소 사용법에 대한 흥미로운 기사를 제공합니다.

이 MSDN 페이지 는 오류 3967을 언급합니다.

tempdb에 공간이 부족하면 데이터베이스 엔진은 버전 저장소를 강제로 줄입니다. 축소 프로세스 중에 행 버전을 아직 생성하지 않은 가장 오래 실행중인 트랜잭션은 대상으로 표시됩니다. 각 희생자 트랜잭션에 대한 오류 로그에 메시지 3967이 생성됩니다. 트랜잭션이 대상으로 표시되면 버전 저장소에서 더 이상 행 버전을 읽을 수 없습니다. 행 버전을 읽으려고하면 메시지 3966이 생성되고 트랜잭션이 롤백됩니다. 축소 프로세스가 성공하면 tempdb에서 공간을 사용할 수있게됩니다.

위에 링크 한 페이지 중 어느 것도 tempdb에 버전 저장소의 최대 크기에 대한 명시적인 조언이 포함되어 있지 않으므로 tempdb 자체의 최대 구성된 크기, tempdb에 사용되는 공간을 뺀 것만 유일한 제한이라고 믿게됩니다 다른 물체.