높은 PAGELATCH_ * 및 WRITELOG가 대기합니다. 그들은 관련이 있습니까? 작업 부하-PAGELATCH_EX를 사용하기 전에 먼저 트랜잭션

높은 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가 이러한 페이지에 액세스 할 때 경합을 발견하면 그러한 대기 시간이 나타납니다.


답변