각 컴포넌트는 메모리 매니저를 사용해서 획득한 메모리 영역을 8Kb 단위로 구분해서 사용한다.
각 메모리 블록은 페이지라고 불린다.
<버퍼 풀(버퍼캐시)>
버퍼 풀(버퍼캐시)은 대다수의 경우 SQL 서버가 확보한 메모리의 가장 많은 부분을 차지하는 영역으로,
데이터베이스의 데이터 페이지와 인덱스 페이지를 디스크에서 읽어들여 캐시하기 위해 사용된다.
SQL 서버가 데이터를 조작하는 경우 버퍼 풀에 읽어들인 데이터를 사용한다. 그때 조작 대상 데이터를 취득하기 위해 매회 버퍼 풀 전체를 스캔하는 것은 아무리 고속 액세스가 가능한 메모리상의 조작이라고 해도 큰 오버헤드가 된다.
때문에 SQL 서버는 버퍼 풀에 데이터베이스를 배치할 때 해시 알고리즘을 사용한다.
각 데이터베이스가 가진 고유의 값을 토대로 해시값이 생성되고 해시 버킷이라는 불리는 페이지에 저장된다.
해시값은 버퍼 풀상의 페이지 포인터와 함께 저장된다.
때문에 해시 버킷 내의 해시값에 액세스 하면 실제 페이지의 위치를 확인 할 수 있다.
이로써 적은 액세스 횟수에도 목적하는 버퍼 풀상의 데이터에 액세스할 수 있다.
각 페이지가 갖고 있는 고유의 관리정보를 토대로 해시값을 생성
- 각 페이지의 위치와 해시값을 해시 버킷이 보관해서 인덱스와 같은 역할을 수행한다.
<플랜캐시>
클라이언트가 실행한 쿼리는 SQL 서버 내에서 최적의 형태로 처리되도록 컴파일되어 쿼리 실행 플랜으로 변환된다.
이 컴파일 시간의 오버헤드를 완화시키는 아키텍쳐가 플랜 캐시 이다.
한 번 컴파일된 쿼리 실행 플랜은 같은 쿼리가 재차 실행됐을 때를 대비해서 플랜 캐시에 보존된다.
2회째 실행 시에는 재차 컴파일되는 게 아니라 플랜 캐시상의 쿼리 실행 플랜을 재이용한다.
그 결과 컴파일 시간만큼의 퍼포먼스가 향상되어 컴파일에 의한 CPU 부하를 줄일 수 있다.
<쿼리 워크스페이스>
쿼리 워크스페이스는 각 쿼리가 결과 세트를 정렬할 필요가 있는 경우에 사용된다. 일정 사이즈 이상의 데이터 정렬이 필요한 경우와 같이 워크스페이스가 아니라 temp db 가 사용되는 일도 있다.
<최적화>
클라이언트가 요구한 쿼리를 실행하기 위해 SQL 서버는 쿼리 실행 플랜을 생성한다.
그때에도 버퍼 풀상의 메모리가 사용된다.
<글로벌>
위의 내용에서 등장하지 않은 다양한 메모리를 필요로 하는 용도에 대해서는 글로벌 영역에서 관리하고 있다. 구체적으로는 락용 메모리, 레플리케잇션 작업용 메모리, 쿼리 텍스트 저장용 메모리 등이 있다.
<지연 라이터 스레드>
지연 라이터의 역할은 임계값보다 많은 수의 프리페이지를 항상 워크스페이스 내에 확보해두는 것이다.
임계값은 SQL 서버에 의해서 동적으로 설정된다.
또한 프리페이지란 디스크에서 읽어들인 데이터를 저장하거나 또는 내부 처리용 영역등의 용도로 사용할 수 있는 미사용 페이지를 의미한다.
지연 라이터는 정기적으로 다음의 사항을 확인한다.
- 윈도우 오퍼레이팅 시스템의 메모리 사용 상황
- 버퍼 풀로서 커밋되어 있는 사이즈
- 프리 페이지의 수
1. 프리 페이지의 수가 임계값을 멤돌고 SQL 서버 메모리의 최대값에는 못 미칠 경우
프리 페이지의 수가 임계값을 밑돌 때 SQL 서버의 메모리 최댓값(max server memory)으로 설정된 값보다 작은 경우는 새로운 메모리 영역을 커밋해서 버퍼 풀에 페이지를 추가한다. 추가한 페이지는 프리 페이지로 인식된다.
2. 프리 페이지의 수가 임계값을 멤돌고 SQL 서버 메모리의 최대값에을 벗어나는 경우
SQL 서버의 메모리 사이즈가 이미 최댓값에 달해 있고, 프리페이지가 임계값을 밑도는 경우 지연 라이터는 프리 페이지를 확보하기 위해 버퍼 풀 내의 페이지 상황을 확인하기 시작한다.
지연 라이터는 주로 아래와 같은 페이지를 해제해서 프리 페이지로 변경한다.
1) 래치되어 있지 않은 페이지
래치(리소스 보호)되어 있는 페이지는 그 시점에서 액세스가 이루어지고 있기 때문에 해제할 수 없다.
2) 더티가 아닌 페이지
더티 페이지란 버퍼 캐시 내의 페이지 내용을 변경했지만 아직 디스크에 변경 내용이 반영되지 않은 상태를 가리킨다.
지연 라이터는 더티 페이지의 디스크에 기록을 요구하고 기록이 완료되어 더티가 아니게 된 시점에서 페이지를 해제한다.
3) 일정 시간 참조하지 않은 페이지
각 페이지는 참조 카운트를 가지고 있고, 그 페이지가 참조되지 않은 채 시간이 경과하면 참조 카운트는 줄어든다.
참조 카운트 수가 일정 값을 밑돌면 일정 시간 참조되지 않았다고 판단해서 그 페이지를 해제한다.
<체크포인트 프로세스>
정기적인 체크포인트 프로세스의 역할은 일정 간격마다 버퍼 풀상의 더티페이지를 디스크상 각 데이터베이스의 물리 데이터 파일에 적어넣는 것이다.
한편 ALTER DATABASE 스테이트먼트의 실행 시(DDL)와 SQL 서버를 종료시키는 경우 또는 직접 체크포인트 스테이트먼트를 실행했을 때 등에도 체크포인트는 실행된다.
체크포인트 프로세스는 더티 페이지를 디스크에 *플래시 할뿐, 특별히 프리 리스트에 페이지를 추가하는 작업을 하지는 않는다.
때문에 직접적으로 버퍼 풀상의 빈 페이지를 증가시키는 것은 아니다.
그러나 버퍼 풀상의 페이지와 물리 데이터파일의 내용을 일치시켜 페이지를 '클린(clean)' 상태로 되돌린다.
그 결과 나중에 지연 라이터가 버퍼 풀의 페이지를 확보할때 디스크의 플래시 수가 감소하여 처리 부하를 줄인다.
*플래시 : 버퍼의 데이터를 디스크에 적어 넣는것
'DB ARCHITECTURE' 카테고리의 다른 글
sql server 데이터베이스 구조의 원리(2) - 파일 액세스 방법 (0) | 2022.05.30 |
---|---|
sql server 데이터베이스 구조의 원리(1) - 데이터 파일 (0) | 2022.05.25 |
sql server 메모리 관리(4) - 프로세스 내부 메모리 관리 방법 (0) | 2022.03.27 |
sql server 메모리 관리(3) - NUMA(Non-Uniform Memory Architecture) (0) | 2022.03.26 |
sql server 메모리 관리(2) - 가상 어드레스 공간의 관리 (2) | 2022.03.25 |