[Oracle] DBMS 구조

Oracle / / 2019. 6. 4. 22:06

1. DBMS 구성

데이터베이스를 사용하기 위해서 우리는 SQL구문으로 DBMS를 이용하여 다양한 처리를 수행합니다. 그리고 저장 장치에 있는 데이터에 접근해서 데이터를 읽고 쓰게 되니다. 이제 DBMS 내부에는 어떠한 기능이 있는지 알아보도록 하겠습니다. 

 

● 쿼리 평가 엔진

쿼리 평가 엔진은 사용자로부터 입력받은 SQL 구문을 분석하고, 어떤 순서로 기억장치의 데이터에 접근할지를 결정합니다. 이때 결정되는 계획을 '실행 계획'이라고 부릅니다. 이러한 실행 계획에 기반을 둬서 데이터에 접근하는 방법을 '접근 메서드'라고 부릅니다. 쿼리 평가 엔진은 계획을 세우고 실행하는 DBMS의 핵심 기능을 담당하는 모듈입니다. 

 

 버퍼 매니저

DBMS는 버퍼라는 메모리 영역을 확보해둡니다. 이 메모리 영역을 관리하는 것이 바로 버퍼 매니저입니다. 버퍼 매니저는 디스크를 관리하는 디스크 용량 매니저와 함께 연동되어 작동합니다.

 

 디스크 용량 매니저

디스크 용량 매니저는 어디에 어떻게 데이터를 저장할지를 관리하며, 데이터의 읽고 쓰기를 제어합니다. 

 

 트랜잭션 매니저와 락 매니저

수백에서 수천 명의 사람이 동시에 데이터베이스에 접근해서 사용하게 되는데, 이때 각각의 처리는 DBMS의 내부에서 트랜잭션이라는 단위로 관리됩니다. 이러한 트랜잭션의 정합성을 유지하면서 실행시키고, 필요한 경우 데이터에 락을 걸어 다른 사람의 요청을 대기시키는 것이 트랜잭션 매니저와 락 매니저의 역할입니다.

 

 리커버리 매니저

DBMS가 저장하고 있는 데이터 중에는 절대 잃어버리면 안 되는 데이터가 있습니다. 장애가 발생했을 때 중요한 데이터는 정기적으로 백업하고, 문제가 일어났을 때 복구를 해줘야합니다. 이 기능을 수행하는 것이 리커버리 매니저입니다. 

 

2. DBMS와 버퍼

데이터를 영구적으로 저장하려고하면 속도를 잃고, 속도를 얻고자 하면 많은 데이터를 저장하기 힘들다는 트레이드오프가 발생합니다. 이 특징은 저장소와 관련된 첫번째 트레이드오프라는 것을 기억해둡시다.

 

DBMS는 데이터 저장을 목적으로하는 미들웨어입니다. 따라서 기억장치와 떨어 뜨릴 수 없는 관계입니다. DBMS가 데이터를 저장하는 매체는 현재 대부분 HDD(하드디스크)입니다. 메모리는 디스크에 비해 기억 비용이 굉장히 비쌉니다. 따라서 하드웨어 1대에 탑재할 수 있는 양이 크지 않습니다. 그렇지만 DBMS가 일부라도 데이터를 메모리에 올리는 것은 성능향상 때문입니다. 즉, SQL 구문의 실행속도를 빠르게 만들기 위해서입니다. 같은 SQL 구문을 실행한다고 해도 디스크에서 데이터를 가져올 필요 없이 곧바로 메모리에서 읽어 빠르게 데이터를 검색할 수 있습니다.

 

만약 메모리에 데이터가 없다면 디스크까지 검색해야 하므로 속도가 저하됩니다. 일반적인 SQL구문의 실행 시간 대부분을 저장소I/O(입출력)에 사용하기 때문입니다. 이렇게 성능 향상을 목적으로 데이터를 저장하는 메모리를 버퍼 또는 캐시라고 부릅니다.

 

고속 접근이 가능한 버퍼에 데이터를 어떻게, 어느 정도의 기간 동안 올릴지를 관리하는 것이 바로 DBMS의 버퍼 매니저입니다.

 

3. 메모리 위에 있는 두 개의 버퍼

DBMS가 데이터를 유지하기 위해 사용하는 메모리는 크게 데이터 캐시와 로그 버퍼 두 종류입니다. 대부분의 DBMS는 이러한 두 개의 역할을 하는 메모리 영역을 가지고 있습니다. 이러한 버퍼는 사용자가 용도에 따라 크기를 변경하는 것이 가능합니다. 

 

● 데이터 캐시

데이터 캐시는 디스크에 있는 데이터의 일부를 메모리에 유지하기 위해 사용하는 메모리 영역입니다. 만약 우리가 실행한 SELECT 구문에서 선택하고 싶은 데이터가 모두 이러한 데이터 캐시에 있다면 굉장히 빠르게 응답합니다.

 

● 로그 버퍼

로그 버퍼는 갱신 처리(INSERT, DELETE, UPDATE, MERGE)와 관련이 있습니다. DBMS는 갱신과 관련된 SQL 구문을 사용자로부터 받으면, 곧바로 저장소에 있는 데이터를 변경하지 않습니다. 일단 로그 버퍼 위에 변경 정보를 보내고 이후 디스크에 변경을 수행합니다. COMMIT 때 메모리부터 디스크로 정보를 복사합니다. 이처럼 데이터베이스의 갱신 처리는 SQL 구문의 실행 시점과 저장소에 갱신하는 시점에 차이가 있는 비동기 처리입니다.

 

이러한 처리 방식을 하는 이유는 바로 성능을 높이기 위해서입니다. 저장소는 갱신을 할 때도 상당한 시간이 소모됩니다. 따라서 저장소 변경이 끝날 때까지 기다리면 사용자는 장기간 대기합니다. 따라서 한 번 메모리에 갱신 정보를 받은 시점에서 사용자에게 해당 SQL구문이 끝났다라고 통지하고, 내부적으로 관련된 처리를 계속 수행합니다.

 

메모리는 휘발성이라는 특징이 있습니다. 데이터 캐시는 장애로 인해 날라가도 디스크에서 다시 읽어오면 되지만, 로그 버퍼에 있는 데이터가 반영이 되기전에 날라간다면 복구가 불가능합니다. 이를 회피하기 위해 DBMS는 커밋 시점에 반드시 갱신 정보를 반드시 로그 파일(영구적인 저장소 위에 존재)에 씀으로써, 장애가 발생해도 정합성을 유지할수 있게 합니다. 커밋이란 확정을 하는 것입니다. DBMS는 커밋된 데이터를 영속화합니다. 반대로 말하면 커밋 때는 반드시 디스크에 동기 접근이 일어납니다. 여기서 지연이 발생할 가능성이 있습니다.

 

이름 데이터 정합성 성능
동기 처리 O X
비동기 처리 X O

4. 시스템 특성에 따른 트레이드오프

데이터 캐시와 로그 버퍼를 비교해보면 Oracle의 경우에 데이터 캐시에 비해 로그 버퍼는 초기값이 1MB도 되지 않습니다. 검색 처리는 한번에 레코드가 수백만에서 수천건 까지 달하는 경우도 있습니다. 하지만 갱신 처리를 할 떄는 갱신 대상이 많아 봤자 트랜잭션마다 한건에서 수만 건 정도밖에 되지 않습니다. 그래서 데이터 캐시에 더 많은 값비싼 메모리를 할당합니다. 실제로 DBMS가 물리 메모리에 여유가 있다면, 데이터 캐시를 되도록 많이 할당할 것을 추천하고 있습니다.

 

5. 추가적인 메모리 영역 '워킹 메모리'

DBMS는 앞의 2가지 버퍼 이외에도, 일반적으로 메모리 영역을 하나 더 가지고 있습니다. 이는 정렬 또는 해시 관련 처리에 사용되는 작업용 영역으로 워킹 메모리라고 부릅니다. 정렬은 ORDER BY구, 집합 연산, 윈도우 함수 등의 기능을 사용할 때 실행됩니다. 반면 해시는 주로 테이블 등의 결합에서 해시 결합이 사용되는 떄 실행됩니다. 이 메모리 영역의 이름과 관리 방법은 DBMS에 따라 다릅니다. Oracle의 경우에는 PGA(Program Global Area)라고 부릅니다. 기본값으로는 10MB 또는 SGA 크기의 20% 중에 큰 것입니다. 

 

이 작업용 메모리 영역은 SQL에서 정렬 또는 해시가 필요할 때 사용되고, 종료되면 해제되는 임시 영역으로, 일반적으로 데이터 캐시와 로그 버퍼와는 다른 영역으로 관리되는 경우가 많습니다. 이 영역이 성능적으로 중요한 이유는 만약 이 영역이 다루려는 데이터 양보다 작아 부족해지면 대부분의 DBMS가 저장소를 사용하기 때문입니다. 이는 OS 동작에서 말하는 스왑과 같은 것입니다. 데이터양이 늘어서 메모리에 들어가지 않으면 저장소를 사용합니다.

 

많은 DBMS는 워킹 메모리가 부족할 때 사용하는 임시적인 영역을 가지고 있습니다. Oracle의 경우 임시 테이블 스페이스(TEMP Tablespace) 라고 부릅니다. 이러한 일시 영역들은 저장소 위에 있으므로 당연히 접근 속도가 느립니다. 

 

* 출처: DB 성능 최적화를 위한 SQL 실전 가이드(미크 지음, 윤인성 옮김)

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기