메모리 관리 아키텍처 – 버퍼 관리_페이지 쓰기

 

  • Version : SQL Server 2005, 2008, 2008R2

 

데이터베이스 엔진 인스턴스의 I/O에는 논리적 읽기 수 및 물리적 읽기 수가 포함되어 있다.

 

논리 쓰기는 버퍼캐시에 있는 페이지의 데이터가 수정 될 때 발생 한다. 물리적 쓰기는 페이지를 버퍼 캐시에서 디스크로 쓸 때 발생 한다.

 

 

페이지가 버퍼 캐시에서 수정 될 때 페이지는 디스크에 바로 기록되지 않고 대신 커밋되지 않음으로 표시 된다. 즉 페이지는 물리적으로 디스크에 기록되기 전에 두 개 이상의 논리적 쓰기를 수행 할 수 있다. 각 논리적 쓰기의 경우 트랜잭션 로그 레코드는 수정 사항을 기록하는 로그 캐시에 삽입 된다. 로그 레코드는 관련된 커밋되지 않은 페이지가 버퍼 캐시에서 제거되고 디스크에 기록되기 전에 디스크에 기록되어야 한다.

 

SQL Server에서는 관련된 로그 레코드가 디스크에 기록되기 전에 커밋되지 않은 페이지를 쓰지 않도록 하는 미리 쓰기 로깅이라는 기술을 사용한다.

 

 

이는 복구 관리자가 정확하게 작업을 하는데 필수 적이다. 다음 그림은 수정한 데이터 페이지를 쓰는 프로세스를 보여준다.

 

 

버퍼 관리자가 페이지를 쓸 때 단일 수집 쓰기 작업에 포함될 수 있는 커밋되지 않은 인접한 페이지를 검색 한다. 인접한 페이지는 연속되는 페이지ID를 포함하며 같은 파일에서 가져온 것이다. 이러한 페이지는 메모리에서 연속되지 않아도 된다. 다음 이벤트 중 하나가 발생할 때까지 앞뒤로 계속 검색 한다.

  • 커밋된 페이지를 찾았습니다.
  • 32개의 페이지를 찾았습니다.
  • LSN(로그 시퀀스 번호)이 로그에 아직 플러시되지 않은 커밋되지 않은 페이지를 찾았습니다.
  • 즉시 래치 할 수 없는 페이지를 찾았습니다.

이렇게 단일 수집 쓰기 작업으로 전체 페이지 집합을 디스크에 쓸 수 있습니다.

 

페이지를 쓰기 직전에 데이터베이스에 지정된 페이지 보호 형식이 페이지에 추가 된다. 조각난 페이지 보호가 추가되면 페이지는 I/O에 대해 EX(베타) 래치 되어야 한다. 이는 조각난 페이지 보호가 페이지를 수정하여 다른 스레드가 읽기에 적합하지 않은 페이지로 만들기 때문이다. 체크섬 페이지 보호가 추가되거나 데이터베이스가 페이지 보호를 사용하지 않으면 페이지는 I/O에 대해 UP(업데이트) 래치 된다. 이렇게 래치하면 쓰는 동안 다른 사람은 페이지를 수정 할 수 없지만 읽는 사람은 페이지를 계속 사용할 수 있다.

 

커밋되지 않은 페이지가 다음 3가지 방법 중 하나로 디스크에 기록 된다.

  • 지연 기록 : 지연 기록기는 버퍼 캐시에서 자주 사용하지 않는 페이지를 제거하여 사용 가능한 버퍼를 제공하는 시스템 프로세스이다. 커밋되지 않은 페이지가 맨 처음 디스크에 기록 된다.
  • 고속 기록 : 고속 기록 프로세스에서는 대량 삽입(Bulk Insert)또는 선택(Select into)과 같은 기록되지 않은 작업과 관련된 커밋되지 않은 데이터 페이지를 기록 한다. 이 프로세스를 통해 병렬로 새 페이지를 만들고 기록할 수 있다. 즉 디스크 페이지를 기록하기 전에 전체 작업을 완료 할 때까지 호출 작업이 대기할 필요가 없다.
  • 검사점 : 검사점 프로세스는 주기적으로 버퍼 캐시에서 지정된 특정 데이터베이스의 페이지를 포함하는 버퍼를 검색한 다음 커밋되지 않은 모든 페이지를 디스크에 기록 한다. 검사점은 커밋되지 않은 모든 페이지가 디스크에 기록되었음을 확인하는 지점을 만들어 나중에 복구하는 동안 시간을 절약할 수 있다. 사용자가 CHECKPOINT 명령을 사용하여 검사점 작업을 요청하거나 데이터베이스 엔진에서 마지막 검사점이 이후 경과된 시간 및 사용된 로그 공간에 따라 자동 검사점을 생성할 수 있다. 또한 검사점은 데이터 또는 로그파일이 데이터베이스에서 제거 또는 추가되는 경우나 SQL Server 인스터턴스가 중지되는 경우 등의 특정 작업이 수행될 때 생성 된다.

 

지연 기록, 고속 기록 및 검사점 프로세스는 I/O 작업이 완료할 때까지 대기하지 않는다. 이 프로세스는 항상 비동기 또는 겹친(overlapped) I/O를 사용하고 기타 작업을 계속 진행하여 이후에 I/O 성공을 확인 한다. 이에 따라 SQL Server에서 해당하는 태스크에 대해 CPU 리소스와 I/O 리소스를 모두 최대화 할 수 있다.

 

 

[참고자료]

페이지 쓰기 : http://msdn.microsoft.com/ko-kr/library/aa337560(v=sql.105).aspx

미리 쓰리 트랜잭션 로그 : http://sqlmvp.kr/140187494960

Checkpoint : http://sqlmvp.kr/140187427437

 

 



강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 34866
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 17233
1794 메모리 관리 아키텍처 – NUMA 지원 방법 jevida(강성욱) 2016.09.29 1618
1793 메모리 관리 아키텍처 – NUMA(Non-Uniform Memory Access)이해 jevida(강성욱) 2016.09.29 1504
1792 메모리 관리 아키텍처 – Hot Add 메모리 jevida(강성욱) 2016.09.28 975
» 메모리 관리 아키텍처 – 버퍼 관리_페이지 쓰기 jevida(강성욱) 2016.09.28 1123
1790 메모리 관리 아키텍처 – 버퍼 관리_페이지 읽기 jevida(강성욱) 2016.09.28 1307
1789 메모리 관리 아키텍처 – 버퍼 관리 jevida(강성욱) 2016.09.28 1928
1788 메모리 관리 아키텍처 – Min/Max Server Memory 효과 jevida(강성욱) 2016.09.28 2632
1787 메모리 관리 아키텍처 – 동적 메모리 관리 jevida(강성욱) 2016.09.28 1409
1786 메모리 관리 아키텍처 – 프로세스 주소 공간 jevida(강성욱) 2016.09.28 1417
1785 메모리 관리 아키텍처 – 메모리 아키텍처 jevida(강성욱) 2016.09.28 1945
1784 데이터 압축 상태에 대한 개체 크기 예상 jevida(강성욱) 2016.09.28 1427
1783 sp_MSforeachdb, sp_MSforeachtable 프로시저 활용하기 jevida(강성욱) 2016.09.28 3306
1782 SQL Server 쿼리 처리 아키텍처_분산 쿼리 아키텍처 jevida(강성욱) 2016.09.28 1207
1781 SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 - 병렬 인덱스 작업 jevida(강성욱) 2016.09.28 1432
1780 SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 - 병렬 처리 수준 jevida(강성욱) 2016.09.28 1966
1779 SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 jevida(강성욱) 2016.09.28 1837
1778 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - Preparing SQL Statements jevida(강성욱) 2016.09.28 1068
1777 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 강제 매개 변수화 jevida(강성욱) 2016.09.28 1064
1776 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 단순 매개 변수화 jevida(강성욱) 2016.09.28 941
1775 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 매개 변수 및 실행 계획 재사용 jevida(강성욱) 2016.09.28 1166





XE Login