높은 WRITELOG 대기와 함께 매우 높은 PAGELATCH_EX 및 PAGELATCH_SH 대기 유형을보고 있습니다. PAGELATCH 대기를 유발하는 쿼리를 진단했으며 IDENTITY 값으로 정의 된 사용중인 클러스터 된 기본 키로의 삽입 속도를 줄임으로써 제거 할 수 있습니다. 이 현상을 마지막 페이지 삽입 래치 경합이라고합니다.
그러나 내 질문은 새 레코드가 삽입 될 때 SQL Server가 버퍼 페이지에서 독점 PAGELATCH_EX를 가져 와서 버퍼 페이지에 레코드를 삽입하고 레코드를 트랜잭션 로그에 쓴 다음 자세한 https : // 로 독점 PAGELATCH_EX를 해제합니까? www.microsoft.com/en-ie/download/details.aspx?id=26665 Page 24 또는 “동시 적으로 PAGELATCH 경합 해결”INSERT 작업 부하-PAGELATCH_EX를 사용하기 전에 먼저 트랜잭션 로그에 레코드를 기록합니까 배경 정보 SQLCAT 안내서 : 관계형 엔진
래칭 메커니즘 외부에서 로그에 기록하도록 기록 된 경우 높은 PAGELATCH 대기의 원인으로 디스크에 느린 기록을 배제 할 수 있습니다. 그러나 기록이 기록 될 때까지 래치가 유지되면 WRITELOG를 고려해야합니다.
또한 여러 개의 비 클러스터형 인덱스가 있으면 PAGELATCH_ * 래치가 더 오래 유지됩니다. 즉, 테이블에 클러스터링되어 있고 여러 개의 비 클러스터형 인덱스가 래치를 추가하여 각 인덱스 버퍼 페이지에 동시에 해제되는 경우?
업데이트 1 confio-sql-server-writelog-wait 슬라이드 2와 일반 WAL 아키텍처를
읽은 후 . 두 백서에 자세히 나와있는 “행이 수정 된 로그 항목 기록”단계는 디스크가 아니라 트랜잭션 로그 캐시의 변경을 기록하는 SQL Server를 참조하고 있다는 것을 이해하고 있습니다. 트랜잭션이 완료되거나 버퍼가 가득 차면 모든 레코드가 즉시 디스크로 플러시됩니다.
답변
그러나 내 질문은 새 레코드가 삽입 될 때 SQL Server가 버퍼 페이지에서 독점 PAGELATCH_EX를 가져 와서 버퍼 페이지에 레코드를 삽입하고 레코드를 트랜잭션 로그에 쓴 다음 독점 PAGELATCH_EX를 해제합니까?
래치는 메모리에있는 동안 페이지의 물리적 무결성 만 보호하므로 페이지가 메모리에있을 때 래치가 사용됩니다. 레코드가 삽입되고 해당 페이지를 가져와야한다고 가정하십시오. 먼저 페이지가 잠기고 메모리에 들어간 다음 걸쇠가 걸리고 정보가 기록됩니다. 이 후의 과정은
-
로그 레코드 생성
-
로그 레코드와 일치하도록 페이지 LSN 업데이트
-
데이터 변경 (더러운 페이지)
-
분리 래치
-
커밋 트랜잭션 시작
-
커밋의 FlushToLSN
-
잠금 해제
-
커밋 거래 완료
위의 단계에 대한 자세한 내용과 설명은 Bob Dorr의 I / O 프레젠테이션 블로그를 참조하십시오.
Pagelatch * 대기는 비 I / O 대기이며 할당 경합으로 인해 대기가 두드러지는 대부분의 시간을 보았습니다. 나의 직감은 그것이 어떻게 무언가와 관련이 있다는 것입니다 tempdb is configured
. tempdb는 어떻게 구성되어 있습니까? 얼마나 많은 tempdb 데이터 파일이 있습니까? 그들이 같은 자동 성장과 같은 크기를 가지고 있는지 확인하십시오 . 새 페이지가 생성 될 때 GAM, SGAM 및 PFS 페이지와 같은 시스템 페이지 를 업데이트하거나 액세스해야하며 SQL Server가 이러한 페이지에 액세스 할 때 경합을 발견하면 그러한 대기 시간이 나타납니다.